天天看點

通用的雙向連結清單(值得收藏)

頭檔案

typedef struct tagListNode

{

 struct tagListNode *pNext;

 struct tagListNode *pPrev;

}ListNode;

//周遊所有節點

#define List_ForEach(pos,head) /

 for ((pos) = (head)->pNext; (pos) != (head); (pos) = (pos)->pNext)

//周遊所有節點(允許删除目前節點pos)

#define List_ForEachSafe(pos,next,head) /

 for ((pos) = (head)->pNext,(next)=(pos)->pNext; (pos) != (head); (pos) = (next),(next)=(next)->pNext)

#define List_Entry(p,type,member) (type*)((char *)(p)-(int)(&(((type*)0)->member)))

//檢查連結清單是否為空

#define List_Empty(head) ((head)->pNext==(head))

//聲明一個初始化的連結清單頭

#define LIST_HEAD(name) ListNode name = {&name,&name}

//初始化連結清單頭

#define INIT_LIST_HEAD(pNode) (pNode)->pPrev=(pNode)->pNext=(pNode);

//把一個新節點插入到pNode之前

extern void List_InsertBefore(ListNode *pNew, ListNode *pNode);

//把一個新節點插入到pNode之後

extern void List_InsertAfter(ListNode *pNew, ListNode *pNode);

//從連結清單删除一個節點

extern void List_Del(ListNode *entry); 

源檔案

#define List_Add(newl,prev,next);  /

    do{         /

    newl->pNext = next;     /

    newl->pPrev = prev;     /

    (newl->pNext)->pPrev = newl;  /

    (newl->pPrev)->pNext = newl;  /

}while(0);

//把一個新節點插入到pNode之前

void List_InsertBefore(ListNode *newl, ListNode *pNode)

{

 List_Add(newl,pNode->pPrev,pNode);

}

//把一個新節點插入到pNode之後

void List_InsertAfter(ListNode *newl, ListNode *pNode)

{

 List_Add(newl,pNode,pNode->pNext);

}

//從連結清單删除一個節點

void List_Del(ListNode *entry)

{

 entry->pPrev->pNext=entry->pNext;

 entry->pNext->pPrev=entry->pPrev;

 entry->pPrev=0;

 entry->pNext=0;

}

繼續閱讀