通用的双向链表
来源:互联网 发布:网络用语零是什么意思 编辑:程序博客网 时间: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;}
- 通用的双向链表
- 通用双向链表
- 通用的双向链表(值得收藏)
- 双向链表的通用模板
- 关于通用双向链表的使用
- 简单通用的双向链表
- 一个通用的双向链表
- 用ASP写的一个通用双向链表
- 通用双向链表的C语言实现
- 双向循环链表 C语言通用编程的思考
- 通用双向链表及宏的使用
- C语言通用双向链表的实现
- 【Redis】对通用双向链表实现的理解
- 实现通用的双向链表(c语言实现)
- C实现通用数据结构--双向链表
- 数据结构通用双向循环链表实现
- 2. linux C -- 通用双向链表
- C语言通用双向链表的实现--设计的艺术
- Java2D+3D游戏王(Yo-Gi-Oh!)开发日志4 —— 卡片编辑器V1.0.1
- php 高效率写法 推荐
- 安装.net时发生error 25015错误
- 三大框架的技术起源
- hello world~
- 通用的双向链表
- java并发也许你不知道的一些内容(读Java Concurrency in Practice)(转)
- C++直接调用外部函数
- Action 委托
- 文章地址
- android面试集锦
- php 魔术函数使用说明
- dom 盒子模型 详解
- 有些歌,放在这慢慢听