通用的双向链表(值得收藏)

头文件

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值