通用的双向链表

来源:互联网 发布:网络用语零是什么意思 编辑:程序博客网 时间:2024/05/07 14:08
#ifndef __STDLIST_H__#define __STDLIST_H__/** 这个通用双向链表就是一个简单的链,但是通过提供的扩展宏,可以嵌套在许多结构中* 使得相应的结构成为一个链表。*typedef struct tagMSGNODE*{*DECLARELISTNODE();*UNIT uMsg;*WPARAM wParam;*LPARAM lParam;*}MSGNODE, *LPMSGNODE;***STDLISTlstMsgQueue;* LPMSGNODE lpMsgNode = malloc(sizeof(MSGNODE));*StdListPushBack(&lstMsgQueue, (LPSTDNODE)lpMsgNode);* by wzj 2010-12-3 */typedef struct tagSTDNODESTDNODE, *LPSTDNODE;typedef struct tagSTDLISTSTDLIST, *LPSTDLIST;//链表数据结构struct tagSTDNODE{LPSTDNODElpPrev;LPSTDNODElpNext;};//链表节点结构struct tagSTDLIST{LPSTDNODElpHead;LPSTDNODElpTail;};//用于链表扩展的宏#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 INLINELPSTDLISTTWINAPIStdListInit(LPSTDLIST lpList){lpList->lpHead = NULL;lpList->lpTail = NULL;return lpList;}//获取链表头部节点STATIC INLINELPSTDNODETWINAPIStdListGetHeadNode( LPSTDLIST lpList ){return lpList->lpHead;}//获取链表的尾部节点STATIC INLINELPSTDNODETWINAPIStdListGetTailNode( LPSTDLIST lpList ){return lpList->lpTail;}//获取给定节点的下一个节点STATIC INLINELPSTDNODETWINAPIStdListGetNextNode( LPSTDNODE lpNode ){return lpNode->lpNext;}//获取给定节点的上一个节点STATIC INLINELPSTNODETWINAPIStdListGetNextNode( LPSTDNODE lpNode ){return lpNode->lpPrev;}//在链表头部插入一个节点STATIC INLINEVOIDTWINAPIStdListPushFront(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 INLINEVOIDTWINAPIStdListPushBack(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 INLINEVOIDTWINAPIStdListInsert( 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 INLINELPSTDNODETWINAPIStdListPopFront(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 INLINELPSTDNODETWINAPIStdListPopBack( 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 INLINELPSTDNODETWINAPIStdListRemove( LPSTDLIST lpList, LPSTDNODElpNode ){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 INLINEBOOLTWINAPIStdListIsEmpty( LPSTDLIST lpList ){if(lpList->lpHead || lpList->lpTail){return FALSE;}else{return TRUE;}}//获取链表中的节点数STATIC INLINELONGTWINAPIStdListGetSize( LPSTDLIST lpList ){LONG lnSize = 0;LPSTDNODE lpNode = StdListGetHeadNode(lpList);while(lpNode){++lnSize;lpNode = StdListGetNextNode(lpNode);}return lnSize;}//合并两个链表STATIC INLINELPSTDLISTTWINAPIStdListCombine( 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;}
原创粉丝点击