数据结构 04 链表 双向链表
2014-01-03 17:57
309 查看
#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_Destroy(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 = 0; 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 ) { sList->slider = node; } if( current == (DLinkListNode*)sList ) { node->pre = NULL;//修正:如果current指向头结点则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 = 0; if( (sList != NULL) && (0 <= pos) && (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 = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { DLinkListNode* current = (DLinkListNode*)sList; DLinkListNode* next = NULL; for(i=0; i<pos; i++) { current = current->next; } ret = current->next; next = ret->next; current->next = next; if( next != NULL ) { next->pre = current; if( current == (DLinkListNode*)sList ) { next->pre = NULL; } } 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<sList->length; i++) { if( current->next == node ) { ret = current->next; break; } current = current->next; } if( ret != NULL ) { DLinkList_Delete(sList, i); } } return ret; } //使游标指向第一个元素 DLinkListNode* DLinkList_Reset(DLinkList* list) { TDLinkList* sList = (TDLinkList*)list; DLinkListNode* ret = NULL; 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; }
相关文章推荐
- 左程云_算法与数据结构 — 链表问题 — 04反转单向和双向链表
- 数据结构:双向链表2
- 线性表16:双向链表 – 数据结构和算法21
- 【数据结构】高效双向链表list、树tree(二叉树)
- 数据结构-双向链表(学习笔记)
- 喜羊羊系列之数据结构双向链表
- 第十九节 数据结构之双向链表
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 小猪的数据结构辅助教程——2.7 线性表中的双向循环链表
- 【数据结构】双向链表的基本操作
- 实现了起起重合,起止重合,止止重合,止起重合判断的双向链表数据结构(对无序数据输入的处理)
- 数据结构:带头结点的双向循环链表
- 温习之数据结构----双向链表
- 数据结构中的双向链表
- 线性表16:双向链表 - 数据结构和算法21
- C语言数据结构之双向链表
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- 数据结构 第4-2讲 双向链表
- java与数据结构(4)---java实现双向循环链表
- 【数据结构】-线性表-双向循环链表-1328:链表的基本操作【好题】