数据结构之双向链表的实现
来源:互联网 发布:四十知天命 编辑:程序博客网 时间:2024/04/26 19:34
*****双向链表的实现*****
双链表就可以看成两个单链表组合成的,只是相比单链表而言,它能从两个方向进行遍历链表,目前还不知道这有什么
优势,因为当我们想查找一个元素时,并不知道一个有序的链表里面这个被查找的元素离哪一边较近。
(1)双链表的结构与单链表有点不一样,它要保证从链表的任意一端都能遍历链表,所以下面是双链表里面的结点的结构:
typedef structdouList{ struct douList *prior; struct douList *next; int data;}DouList;
(2)双向链表的创建,并初始化:
DouList *Creat_List(){ DouList *root = NULL; DouList *pre = NULL; DouList *cur = NULL; int data = 0; int i = 0; root = (DouList*)malloc(sizeof(DouList)); if(NULL == root) { printf("ERROR:Can't malloc the root.\n"); exit(ERROR); } root->next = NULL; root->prior = NULL; pre = root; while(++i <= 10) { cur = (DouList*)malloc(sizeof(DouList)); if(NULL == cur) { printf("ERROR:Can't malloc the current List\n"); exit(ERROR); } //init the cur cur->next =NULL; cur->prior =NULL; cur->data =2*i - 1; //connect theDoubly Linked List pre->next =cur; cur->next =NULL; if(pre == root) { cur->prior= NULL; pre->prior= NULL; pre->prior= cur; } else { root->prior= cur; cur->prior= pre; } pre = cur; } return root;}
(2)双向链表的遍历:
<1>正向遍历,即以next方向遍历:
voidShow_NextList(DouList *root){ DouList *pre = root->next; printf("This is the doublylinked list in the next order;\n"); while(NULL != pre) { printf("%d\n",pre->data); pre =pre->next; }}
<2>反向遍历,即以prior方向遍历:
voidShow_PriorList(DouList *root){ DouList *pre = root->prior; printf("This is the doublylinked list in the prior order;\n"); while(NULL != pre) { printf("%d\n",pre->data); pre =pre->prior; }}
(3)查找结点,同样这里只实现返回结点:
<1>正向查找:
DouList*Find_NextList(DouList *root){ DouList *cur = root->next; int data; printf("Enter a data youwant to find in next order:\n"); scanf("%d",&data); while(NULL != cur) { if(data ==cur->data) { returncur; } cur =cur->next; } return NULL;}
<2>反向查找:
DouList*Find_PriorList(DouList *root){ DouList *cur = root->prior; int data; printf("Enter a data youwant to find in prior order:\n"); scanf("%d",&data); while(NULL != cur) { if(data ==cur->data) { returncur; } cur =cur->prior; } return NULL;}
(4)插入新结点:(仅实现了next方向的插入)
DouList*Insert_List(DouList *root){ DouList *cur = root->next; DouList *pre = root; int data = 0; DouList *newList = NULL; printf("Enter the data youwant to insert:\n"); scanf("%d",&data); newList = (DouList*)malloc(sizeof(DouList)); if(NULL == newList) { printf("ERROR:Can't malloc the new List.\n"); exit(ERROR); } newList->data = data; newList->next = NULL; newList->prior = NULL; while(NULL != cur->next) { //find thelocation which need to be inserted if(data < cur->data) { //ifthe new List in the front of the first List(except the root) if(root->next== cur) { root->next= newList; newList->next= cur; newList->prior= NULL; cur->prior= newList; } //ifthe new List in the front of the last List //whenin the order of next else { pre->next= newList; newList->next= cur; newList->prior= pre; cur->prior= newList; } break; } //move thepointer to the doubly linked list else { pre= cur; cur= cur->next; } } if(NULL == cur->next) { //insert the newList in the front of last List if(data <cur->data) { pre->next= newList; newList->next= cur; cur->prior= newList; newList->prior= pre; } //insert the newList in the last List else { cur->next= newList; newList->next= NULL; newList->prior= cur; root->prior= newList; } } //insert successe return newList;}
(5)删除结点:(仅实现了以next的方向)
DouList*Delete_List(DouList *root){ DouList *cur = root->next; DouList *pre = root; DouList *deleteList = NULL; int data; printf("Enter a data youwant to delete:\n"); scanf("%d",&data); while(NULL != cur->next) { if(data ==cur->data) { deleteList= cur; //ifthe list to delete is in the first List(except the root) if(root->next== cur) { cur->next->prior= NULL; root->next= cur->next; } //ifthe list to delete isn't in the first List(except the root) else { pre->next= cur->next; cur->next->prior= pre; } free(cur); //thedeleteList is connected with the cur //whencur was free,deleteList will become shakable //shouldinit the deleteList to let the return's use deleteList->next= NULL; deleteList->prior= NULL; deleteList->data= data; returndeleteList; } else { pre= cur; cur= cur->next; } } //when the list to delete is inthe last List if(data == cur->data) { deleteList = cur; pre->next =NULL; root->prior =pre; free(cur); deleteList->next= NULL; deleteList->prior= NULL; deleteList->data= data; returndeleteList; } return NULL;}
*****总结*****
这次能够实现这两种链表的功能,这要靠两种工具:
(1)严老师的《数据结构》一书,里面提供了链表实现的各种的思想基础
(2)调试,以前总看别人写的东西都说C程序员必须学会调试,这次实现这些东西的一大利器
就是它了,初次使用调试来解决指针问题,真心觉得它的前途无限。
- 数据结构之双向链表的实现
- 数据结构之双向链表的Java实现
- 数据结构之——循环双向链表的实现
- 数据结构之双向链表实现
- 动手实现 数据结构 之 “双向链表”
- 数据结构练习--双向链表的实现
- 数据结构双向链表的实现
- 数据结构-双向链表的实现
- [数据结构] 双向链表的实现
- 基础数据结构--双向链表的实现
- 【数据结构】双向链表实现
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 数据结构之双向链表
- 外媒评网络游戏行业未来发展五大趋势
- Infobright的优点
- Visual Studio中最常用的13个快捷键
- 设置对话框为半透明
- new一些鲜为人知的用法!
- 数据结构之双向链表的实现
- NHibernate 配置参数
- 电控单体泵柴油机之启动
- 畅游陈德文:中国网游的发展与未来趋势
- Windows 下使用Eclipse CDT 远程调试 Linux C/C++ 程序
- 巨人纪学峰:未来网游发展趋势是社区化
- hdu 1250 hdu 1130 java水大数
- 王洪业:手机网游是游戏未来发展趋势
- Java SE1.6中的Synchronized