00001
00002
00003
00004
00005
00006
00007
00008
00015 #ifndef DEF_DLIST_H
00016 #define DEF_DLIST_H
00017
00018
00019
00023 typedef struct _dlNode_ {
00024 struct _dlNode_ *next;
00025 struct _dlNode_ *prev;
00026 void *val;
00027 } dlNode;
00028
00029
00030
00034 typedef struct {
00035 dlNode *head;
00036 dlNode *nullMiddle;
00037 dlNode *tail;
00038 } dlList;
00039
00040
00044 #define dlEnd(node) (node->next == NULL)
00045
00049 #define dlStart(node) (node->prev == NULL)
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 dlList *dlListNew (void);
00062 void dlListInit(dlList *dl);
00063 void dlListReset(dlList *dl);
00064 void dlListFree(dlList **pList);
00065 void dlListFreeAndVals(dlList **pList);
00066 void dlAddBefore(dlNode *anchor, dlNode *newNode);
00067 void dlAddAfter(dlNode *anchor, dlNode *newNode);
00068 void dlAddHead(dlList *list, dlNode *newNode);
00069 void dlAddTail(dlList *list, dlNode *newNode);
00070 dlNode *dlAddValBefore(dlNode *anchor, void *val);
00071 dlNode *dlAddValAfter(dlNode *anchor, void *val);
00072 dlNode *dlAddValHead(dlList *list, void *val);
00073 dlNode *dlAddValTail(dlList *list, void *val);
00074 void dlRemove(dlNode *node);
00075 void dlRemoveHead(dlList *list);
00076 void dlRemoveTail(dlList *list);
00077 dlNode *dlPopHead(dlList *list);
00078 dlNode *dlPopTail(dlList *list);
00079 void dlDelete(dlNode **nodePtr);
00080 int dlCount(dlList *list);
00081 int dlEmpty(dlList *list);
00082
00086 #define dlIsEmpty(list) ((list)->head->next == NULL)
00087
00088
00089 dlNode *dlGetBeforeHead(dlList *list);
00090 dlNode *dlGetAfterTail(dlList *list);
00091 void dlSort(dlList *list, int (*compare )(const void *elem1, const void *elem2));
00092 void dlCat(dlList *a, dlList *b);
00093 dlNode *dlValInList(dlList *list, void *val);
00094
00095 #endif