单链表的局限:
单链表的节点都只有一个指向下一个节点的指针。
单链表的数据元素无法直接访问其前驱元素(逆序访问单链表中的元素是及其耗时的操作)。
双向链表的定义:
在单链表的节点中增加一个指向其前驱的pre指针。
typedef void DLinkList; typedef struct _tag_DLinkListNode DLinkListNode; struct _tag_DLinkListNode { DLinkListNode* next; DLinkListNode* pre; };
实现代码:
头文件:
#ifndef __DLISTLINK_H_ #define __DLISTLINK_H_ typedef void DLinkList; typedef struct _tag_DLinkListNode DLinkListNode; struct _tag_DLinkListNode { DLinkListNode* next; DLinkListNode* pre; }; DLinkList* DLinkList_Create(); void DLinkList_Destory(DLinkList* list); void DLinkList_Clear(DLinkList* list); int DLinkList_Length(DLinkList* list); int DLinkList_Insert(DLinkList *list,DLinkListNode *node,int pos); DLinkListNode *DLinkList_Get(DLinkList* list,int pos); DLinkListNode *DLinkList_Delete(DLinkList *list,int pos); DLinkListNode *DLinkList_DeleteNode(DLinkList *list,DLinkListNode *node); DLinkListNode *DLinkListReset(DLinkList *list); DLinkListNode *DLinkList_Current(DLinkList *list); DLinkListNode *DLinkList_Next(DLinkList *list); DLinkListNode *DLinkList_Pre(DLinkList *list); #endif
实现的c文件:
#include <stdio.h> #include <malloc.h> #include "DLinkList.h" typedef struct _tag_DLinkList { DLinkListNode header; DLinkListNode *slider; int Length; }TDLinkList; /* 创建一个头结点 */ DLinkList* DLinkList_Create()//O(1) { TDLinkList *ret = (TDLinkList*)malloc(sizeof(TDLinkList)); if(ret != NULL) { ret->Length = 0; ret->header.next = NULL; ret->header.pre = NULL; ret->slider = NULL; } return ret; } /* 释放链表 */ void DLinkList_Destory(DLinkList* list)//O(1) { free(list); } /* 链表清空 */ void DLinkList_Clear(DLinkList* list)//O(1) { TDLinkList *sList = (TDLinkList*)list; if(sList != NULL) { sList->Length = 0; sList->header.next = NULL; sList->header.pre = NULL; sList->slider = NULL; } } /* 得到链表长度 */ int DLinkList_Length(DLinkList* list)//O(1) { TDLinkList *sList = (TDLinkList*)list; int ret = -1; if(sList != NULL) { ret = sList->Length; } return ret; } /* 链表的插入 */ int DLinkList_Insert(DLinkList *list,DLinkListNode *node,int pos)//O(n) { TDLinkList *sList = (TDLinkList*)list; int ret = (sList != NULL)&&(pos >= 0)&&(node != NULL); int i; if( ret ) { DLinkListNode *current = (DLinkListNode*)sList; DLinkListNode *next = NULL; //移动到插入的位置 for(i=0; (i<pos)&&(current->next != NULL); i++) { current = current->next; } next = current->next; current->next = node; node->next = next; //判断头结点后面不为空 if (next != NULL) { next->pre = node; } node->pre = current; //第一个节点的前向指针为空 if(sList->Length == 0) { node->pre = NULL; sList->slider = node; } if(current == (DLinkListNode*)sList) { node->pre = NULL; } sList->Length++; } return ret; } /* 链表的查找 */ DLinkListNode *DLinkList_Get(DLinkList* list,int pos)//O(n) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; int i; if( (0<=pos) && (sList != NULL) &&(pos < sList->Length)) { DLinkListNode *current = (DLinkListNode*)sList; for(i=0; (i<pos); i++) { current = current->next; } ret = current->next; } return ret; } /* 单链表的删除 */ DLinkListNode *DLinkList_Delete(DLinkList *list,int pos)//O(n) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; int i; if( (0<=pos) && (sList != NULL) &&(pos < sList->Length)) { DLinkListNode *current = (DLinkListNode*)sList; DLinkListNode *next = NULL; for(i=0; (i<pos); i++) { current = current->next; } //指向要删除的节点 ret = current->next; //next指向要删除节点的下一个节点 next = ret->next; current->next = ret->next; //不是第一个节点 if(next != NULL) { next->pre = current; //判断是否是头节点 if(current == ( DLinkListNode*)sList) { next->pre = NULL; } } //如果删除第一个节点,slider指向第二个节点 if( sList->slider == ret ) { sList->slider = next; } sList->Length--; } return ret; } DLinkListNode *DLinkList_DeleteNode(DLinkList *list,DLinkListNode *node) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; int i = 0; //查找需要删除的节点 if(sList != NULL) { DLinkListNode *current = (DLinkListNode*)sList; for(i=0; i<DLinkList_Length(sList); i++) { if(current->next == node) { ret = current->next; break; } current = current->next; } if(ret != NULL) { DLinkList_Delete(sList,i); } } return ret; } DLinkListNode *DLinkListReset(DLinkList *list) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; //默认slider指向第一个节点 if(sList != NULL) { sList->slider = sList->header.next; ret = sList->slider; } return ret; } DLinkListNode *DLinkList_Current(DLinkList *list) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; if(sList != NULL) { ret = sList->slider; } return ret; } DLinkListNode *DLinkList_Next(DLinkList *list) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; if( (sList != NULL) && (sList->slider != NULL) ) { ret = sList->slider; sList->slider = ret->next; } return ret; } DLinkListNode *DLinkList_Pre(DLinkList *list) { TDLinkList *sList = (TDLinkList*)list; DLinkListNode *ret = NULL; if( (sList != NULL) && (sList->slider != NULL) ) { ret = sList->slider; sList->slider = ret->pre; } return ret; }
测试代码:
#include <stdio.h> #include "DLinkList.h" #include <stdlib.h> struct Value { DLinkListNode header; int v; }; int main(int argc, char *argv[]) { int i = 0; DLinkList *list = DLinkList_Create(); struct Value v1; struct Value v2; struct Value v3; struct Value v4; struct Value v5; v1.v = 1; v2.v = 2; v3.v = 3; v4.v = 4; v5.v = 5; DLinkList_Insert(list,(DLinkListNode*)&v1,0); DLinkList_Insert(list,(DLinkListNode*)&v2,0); DLinkList_Insert(list,(DLinkListNode*)&v3,0); DLinkList_Insert(list,(DLinkListNode*)&v4,0); DLinkList_Insert(list,(DLinkListNode*)&v5,0); DLinkListReset(list); //DLinkList_Pre(list); printf("%x\n",DLinkList_Current(list)); DLinkList_Destory(list); printf("Press enter to continue ..."); getchar(); return 0; } /*测试代码 int i = 0; DLinkList *list = DLinkList_Create(); struct Value v1; struct Value v2; struct Value v3; struct Value v4; struct Value v5; v1.v = 1; v2.v = 2; v3.v = 3; v4.v = 4; v5.v = 5; DLinkList_Insert(list,(DLinkListNode*)&v1,DLinkList_Length(list)); DLinkList_Insert(list,(DLinkListNode*)&v2,DLinkList_Length(list)); DLinkList_Insert(list,(DLinkListNode*)&v3,DLinkList_Length(list)); DLinkList_Insert(list,(DLinkListNode*)&v4,DLinkList_Length(list)); DLinkList_Insert(list,(DLinkListNode*)&v5,DLinkList_Length(list)); for(i=0; i<DLinkList_Length(list); i++) { struct Value *pv = (struct Value*)DLinkList_Get(list,i); printf("%d\n",pv->v); } printf("length = %d\n",DLinkList_Length(list)); printf("\n"); DLinkList_Delete(list,DLinkList_Length(list)-1); DLinkList_Delete(list,0); printf("\n"); for(i=0; i<DLinkList_Length(list); i++) { struct Value *pv = (struct Value*)DLinkList_Next(list); printf("%d\n",pv->v); } printf("length = %d\n",DLinkList_Length(list)); printf("\n"); DLinkListReset(list); DLinkList_Next(list); struct Value *pv = (struct Value*)DLinkList_Current(list); printf("%d\n",pv->v); printf("length = %d\n",DLinkList_Length(list)); printf("\n"); DLinkList_DeleteNode(list,(DLinkListNode*)pv); pv = (struct Value*)DLinkList_Current(list); printf("%d\n",pv->v); printf("length = %d\n",DLinkList_Length(list)); DLinkListReset(list); for(i=0; i<DLinkList_Length(list); i++) { struct Value *pv = (struct Value*)DLinkList_Next(list); printf("%d\n",pv->v); } printf("length = %d\n",DLinkList_Length(list)); */