数据结构封装之《DLinkList双向链表》
2017-08-29 13:39
190 查看
说明:
双向链表的每个数据节点中有2个指针,分别指向前一个节点和后一个节点;该链表有一个链表头,header->next指向第一个数据节点,slider为游标,length记录当前节点的数量;
存储的数据需要一个结构体,格式如下:
struct Value
{
DLinkListNode header;//指针域
int(←这里可以任意类型) v;//数据域
};
具有高效的逆序访问的功能;
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
DLinkList.h#ifndef _DLINKLIST_H_ #define _DLINKLIST_H_ typedef void DLinkList; typedef struct _tag_DLinkListNode DLinkListNode; struct _tag_DLinkListNode { DLinkListNode* next; DLinkListNode* pre; }; DLinkList* DLinkList_Create(); void DLinkList_Destroy(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* DLinkList_Reset(DLinkList* list); DLinkListNode* DLinkList_Current(DLinkList* list); DLinkListNode* DLinkList_Next(DLinkList* list); DLinkListNode* DLinkList_Pre(DLinkList* list); #endif
DLinkList.c
#include <stdio.h> #include <malloc.h> #include "DLinkList.h" typedef struct _tag_DLinkList { DLinkListNode header; DLinkListNode* slider; int length; } TDLinkList; //创建链表 DLinkList* DLinkList_Create() { 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) { free(list); } //清空链表 void DLinkList_Clear(DLinkList* list) { 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) { TDLinkList* sList = (TDLinkList*)list; int ret = -1; if( sList != NULL ) { ret = sList->length; } return ret; } //指定位置插入数据元素,并返回是否成功 int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) { 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 ) { node->pre = NULL; sList->slider = node;//默认游标为第一个元素 } sList->length++; } return ret; } //获取指定下标的数据元素 DLinkListNode* DLinkList_Get(DLinkList* list, int pos) { 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) { 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; }
main.c
#include <stdio.h> #include <stdlib.h> #include "DLinkList.h" struct Value { DLinkListNode header;//指针域 int v;//数据域 }; int main(int argc, char *argv[]) { int i = 0; DLinkList* list = DLinkList_Create(); struct Value* pv = NULL; 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++) { pv = (struct Value*)DLinkList_Get(list, i); printf("%d\n", pv->v); } printf("\n"); DLinkList_Delete(list, DLinkList_Length(list)-1); DLinkList_Delete(list, 0); for(i=0; i<DLinkList_Length(list); i++) { pv = (struct Value*)DLinkList_Next(list); printf("%d\n", pv->v); } printf("\n"); DLinkList_Reset(list); DLinkList_Next(list); pv = (struct Value*)DLinkList_Current(list); printf("%d\n", pv->v); DLinkList_DeleteNode(list, (DLinkListNode*)pv); pv = (struct Value*)DLinkList_Current(list); printf("%d\n", pv->v); DLinkList_Pre(list); pv = (struct Value*)DLinkList_Current(list); printf("%d\n", pv->v); printf("Length: %d\n", DLinkList_Length(list)); DLinkList_Destroy(list); return 0; }
函数结构分析:
1.DLinkList_Create2.DLinkList_Destroy
3.DLinkList_Clear
4.DLinkList_Length
5.DLinkList_Insert
6.DLinkList_Get
7.DLinkList_Delete
8.DLinkList_Reset
9.DLinkList_Current
10.DLinkList_Next
11.DLinkList_Next
汇编分析:
1.DLinkList_Create2.DLinkList_Insert
3.DLinkList_Delete
相关文章推荐
- JS高级-数据结构的封装
- 【算法和数据结构】线性表(三)栈的定义和封装
- non object数据结构对象封装和序列化
- 数据结构封装之《GTree通用树》
- 3D游戏引擎底层数据结构的封装之Stack
- 3D游戏引擎底层数据结构的封装之List
- 3D游戏引擎底层数据结构的封装之Stack
- 【数据结构】之并查集简易封装
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- 一种数据结构的封装模式
- Nginx学习(3)—封装的数据结构
- 3D游戏引擎底层数据结构的封装之List
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- 数据结构中的栈,在解决很多问题都有用处,比如括号匹配,迷宫求解,表达式求值等等 java中有封装好的类,可以直接调用。
- 数据结构数组接口和封装
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 Vector (向量)
- C# 一个自己写的树结构代码(2)-Array,HashTable,List,String数据结构操作封装
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)[转自柒笑侠]
- java 数据结构实现数组封装 (一)