頭檔案
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;
}