通用的双向链表

#ifndef __STDLIST_H__ #define __STDLIST_H__ /* * 这个通用双向链表就是一个简单的链,但是通过提供的扩展宏,可以嵌套在许多结构中 * 使得相应的结构成为一个链表。 * typedef struct tagMSGNODE * { * DECLARELISTNODE(); * UNIT uMsg; * WPARAM wParam; * LPARAM lParam; * }MSGNODE, *LPMSGNODE; * * * STDLIST lstMsgQueue; * LPMSGNODE lpMsgNode = malloc(sizeof(MSGNODE)); * StdListPushBack(&lstMsgQueue, (LPSTDNODE)lpMsgNode); * by wzj 2010-12-3 */ typedef struct tagSTDNODE STDNODE, *LPSTDNODE; typedef struct tagSTDLIST STDLIST, *LPSTDLIST; //链表数据结构 struct tagSTDNODE { LPSTDNODE lpPrev; LPSTDNODE lpNext; }; //链表节点结构 struct tagSTDLIST { LPSTDNODE lpHead; LPSTDNODE lpTail; }; //用于链表扩展的宏 #define NODE_INITIALIZER ((STDNODE){.lpPrev = NULL, .lpNext = NULL,}) #define LIST_INITIALIZER ((STDLIST){.lpHead = NULL, .lpNext = NULL,}) #define DECLARELISTNODE() STDNODE __snStdNode #define INIT_LISTNODE() __snStdNode = NODE_INITIALIZER //初始化链表 STATIC INLINE LPSTDLIST TWINAPI StdListInit( LPSTDLIST lpList ) { lpList->lpHead = NULL; lpList->lpTail = NULL; return lpList; } //获取链表头部节点 STATIC INLINE LPSTDNODE TWINAPI StdListGetHeadNode( LPSTDLIST lpList ) { return lpList->lpHead; } //获取链表的尾部节点 STATIC INLINE LPSTDNODE TWINAPI StdListGetTailNode( LPSTDLIST lpList ) { return lpList->lpTail; } //获取给定节点的下一个节点 STATIC INLINE LPSTDNODE TWINAPI StdListGetNextNode( LPSTDNODE lpNode ) { return lpNode->lpNext; } //获取给定节点的上一个节点 STATIC INLINE LPSTNODE TWINAPI StdListGetNextNode( LPSTDNODE lpNode ) { return lpNode->lpPrev; } //在链表头部插入一个节点 STATIC INLINE VOID TWINAPI StdListPushFront( LPSTDLIST lpList, LPSTDNODE lpNode ) { lpNode->lpPrev = NULL; lpNode->lpNext = lpList->lpHead; if(lpList->lpHead) { lpList->lpHead->lpPrev = lpNode; } else { lpList->lpTail = lpNode;//仅有一个节点时,头和尾是一样的~~ } lpList->lpHead = lpNode; } //在链表尾部插入一个节点 STATIC INLINE VOID TWINAPI StdListPushBack( LPSTDLIST lpList, LPSTDNODE lpNode ) { lpNode->lpNext = NULL; lpNode->lpPrev = lpList->lpTail; if(lpList->lpTail) { lpList->lpTail->lpNext = lpNode; } else { lpList->lpHead = lpNode; } lpList->lpTail = lpNode; } //在指定节点后插入一个节点 STATIC INLINE VOID TWINAPI StdListInsert( LPSTDLIST lpList, LPSTDNODE lpAfter, LPSTDNODE lpNode ) { if(lpAfter) { if(lpAfter->lpNext) { lpAfter->lpNext->lpPrev = lpnode; } else { //如果lpAfter->lpNext是空的,说明lpAfter是最后一个节点,需要修改尾节点 lpList->lpTail = lpNode; } lpNode->lpPrev = lpAfter; lpNode->lpNext = lpAfter->lpNext; } else { StdListPushFront(lpList,lpNode);//不存在lpAfter的话,就从前面插入 } } //从链表头部弹出一个节点 STATIC INLINE LPSTDNODE TWINAPI StdListPopFront( LPSTDLIST lpList ) { if(lpList->lpHead) { LPSTDNODE lpNode = lpList->lpHead; if(lpList->lpHead->lpNext) { //如果head有next 先切断联系 lpList->lpHead->lpNext->lpPrev =NULL; } else { //没有next说明就一个节点,既是头也是尾,也就是说,表中就一个节点 lpList->lpTail = NULL; } lpList->lpHead = lpList->lpHead->lpNext; lpNode->lpPrev = lpNode->lpNext = NULL; return lpNode; } else { return NULL; } } //从链表尾弹出一个节点 STATIC INLINE LPSTDNODE TWINAPI StdListPopBack( LPSTDLIST lpList ) { if(lpList->lpTail) { LPSTDNODE lpNode = lpList->lpTail; if(lpList->lpTail->lpPrev) { lpList->lpTail->lpPrev->lpNext = NULL; } else { lpList->lpHead = NULL; } lpList->lpTail = lpList->lpTail->lpPrev; lpNode->lpPrev = lpNode->lpNext = NULL; return lpNode; } else { return NULL; } } //从链表中删除给定的节点 STATIC INLINE LPSTDNODE TWINAPI StdListRemove( LPSTDLIST lpList, LPSTDNODE lpNode ) { if(lpNode->lpPrev) { lpNode->lpPrev->lpNext = lpNode->lpNext; } else { lpList->lpHead = lpNode->lpNext; } if(lpNode->lpNext) { lpNode->lpNext->lpPrev = lpNode->lpPrev; } else { lpList->lpTail = lpNode->lpPrev; } return lpNode; } //检查链表是否为空 STATIC INLINE BOOL TWINAPI StdListIsEmpty( LPSTDLIST lpList ) { if(lpList->lpHead || lpList->lpTail) { return FALSE; } else { return TRUE; } } //获取链表中的节点数 STATIC INLINE LONG TWINAPI StdListGetSize( LPSTDLIST lpList ) { LONG lnSize = 0; LPSTDNODE lpNode = StdListGetHeadNode(lpList); while(lpNode) { ++lnSize; lpNode = StdListGetNextNode(lpNode); } return lnSize; } //合并两个链表 STATIC INLINE LPSTDLIST TWINAPI StdListCombine( LPSTDLIST lpList1, LPSTDLIST lpList2 ) { if(!StdListIsEmpty(lpList2)) { if(!StdListIsEmpty(lpList1)) { lpList1->lpTail->lpNext = lpList2->lpHead; lpList2->lpHead->lpPrev = lpList1->lpTail; lpList1->lpTail = lpList2->lpTail; } else { lpList1->lpHead = lpList2->lpHead; lpList1->lpTail = lpList2->lpTail; } lpList2->lpHead = lpList2->lpTail =NULL; } return lpList1; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值