




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第详解C语言中双向循环链表的实现目录实现细节辅助理解图具体实现代码1、对链表进行初始化2、任意位置前的插入3、任意位置的删除4、头插和尾删完整代码头文件具体函数测试
实现细节
1、带一个哨兵位(哨兵节点,初始节点,不存储有效数据,用来方便后期数据的存储与查找)
2、与单向链表不同的是,双向链表中每个数据节点包含两个指针,分别指向前后两个节点
3、双向链表是循环的,其尾节点后不是空指针,而是与头部的哨兵节点通过指针相连
辅助理解图
具体实现代码
1、对链表进行初始化
初始化:哨兵位的前后指针均指向哨兵节点本身
voidListInit(ListNode**pphead)
*pphead=(ListNode*)malloc(sizeof(ListNode));
if(*pphead==NULL)
perror("ListInit");
exit(-1);
(*pphead)-date=-1;
(*pphead)-next=*pphead;
(*pphead)-prev=*pphead;
2、任意位置前的插入
注意:插入位置前后节点中的前后指针要进行相应的更换
voidAny_insert(ListNode*pos,Listtypedate)
ListNode*Prev=pos-prev;
//建立新节点
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Any_insert");
exit(-1);
NewNode-date=date;
NewNode-next=pos;
pos-prev=NewNode;
Prev-next=NewNode;
NewNode-prev=Prev;
3、任意位置的删除
细节点:当链表中没有数据时,就不用删除,因此需要建立一个函数进行判断
boolDetermine(ListNode*pphead)
{//判断链表中有无元素
assert(pphead);
returnpphead==pphead-next;
voidAny_delet(ListNode*pos)
assert(!Determine(pos));
ListNode*Next=pos-next;
ListNode*Prev=pos-prev;
Next-prev=Prev;
Prev-next=Next;
free(pos);
4、头插和尾删
此处的插入和删除,十分方便,即:对上面的任插和任删进行套用
头插如下:
voidHead_insert(ListNode*pphead,Listtypedate)
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Head_insert");
exit(-1);
//单独实现
//NewNode-date=date;
//NewNode-prev=pphead;
//NewNode-next=pphead-next;
//pphead-next-prev=NewNode;
//pphead-next=NewNode;
//进行任插的复用
Any_insert(pphead-next,date);
尾删如下:
voidTail_delet(ListNode*pphead)
assert(pphead);
//单独实现
//assert(Determine(pphead));
/*ListNode*tail=pphead-prev;
if(tail!=pphead)
ListNode*tailprev=tail-prev;
tailprev-next=pphead;
pphead-prev=tailprev;
free(tail);
//尾删的复用
Any_delet(pphead-prev);
完整代码
头文件
#pragmaonce
#includestdio.h
#includemalloc.h
#includestdlib.h
#includeassert.h
#includestdbool.h
typedefintListtype;
typedefstructListNode
structListNode*prev;
Listtypedate;
structListNode*next;
}ListNode;
voidListInit(ListNode**pphead);//链表初始化
voidListNode_ADD(ListNode*pphead,Listtypedate);//尾插
voidHead_insert(ListNode*pphead,Listtypedate);//头插
voidListNode_Print(ListNode*pphead);//链表打印
voidTail_delet(ListNode*pphead);//尾删
boolDetermine(ListNode*pphead);//判断表中有无数据
voidAny_insert(ListNode*pos,Listtypedate);//任插
voidAny_delet(ListNode*pos);//任删
voidList_Destory(ListNode*pos);//链表清空
具体函数
#define_CRT_SECURE_NO_WARNINGS1
#include"List.h"
//链表打印
voidListNode_Print(ListNode*pphead)
assert(pphead);
ListNode*phead=pphead;
pphead=pphead-next;
for(;pphead!=phead;pphead=pphead-next)
printf("%d",pphead-date);
printf("\n");
boolDetermine(ListNode*pphead)
{//判断链表中有无元素
assert(pphead);
returnpphead==pphead-next;
//链表初始化
voidListInit(ListNode**pphead)
*pphead=(ListNode*)malloc(sizeof(ListNode));
if(*pphead==NULL)
perror("ListInit");
exit(-1);
(*pphead)-date=-1;
(*pphead)-next=*pphead;
(*pphead)-prev=*pphead;
voidListNode_ADD(ListNode*pphead,Listtypedate)
//ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
//if(NewNode==NULL)
//perror("ADD_malloc");
//exit(-1);
//NewNode-date=date;
//NewNode-prev=pphead-prev;
//pphead-prev-next=NewNode;
//pphead-prev=NewNode;
//NewNode-next=pphead;
//任插的复用
Any_insert(pphead,date);
voidHead_insert(ListNode*pphead,Listtypedate)
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Head_insert");
exit(-1);
//NewNode-date=date;
//NewNode-prev=pphead;
//NewNode-next=pphead-next;
//pphead-next-prev=NewNode;
//pphead-next=NewNode;
//进行任插的复用
Any_insert(pphead-next,date);
voidTail_delet(ListNode*pphead)
assert(pphead);
//assert(Determine(pphead));
/*ListNode*tail=pphead-prev;
if(tail!=pphead)
ListNode*tailprev=tail-prev;
tailprev-next=pphead;
pphead-prev=tailprev;
free(tail);
//尾删的复用
Any_delet(pphead-prev);
//在任意位置前插入
voidAny_insert(ListNode*pos,Listtypedate)
ListNode*Prev=pos-prev;
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Any_insert");
exit(-1);
NewNode-date=date;
NewNode-next=pos;
pos-prev=NewNode;
Prev-next=NewNode;
NewNode-prev=Prev;
//任意位置删除
voidAny_delet(ListNode*pos)
assert(!Determine(pos));
ListNode*Next=pos-next;
ListNode*Prev=pos-prev;
Next-prev=Prev;
Prev-next=Next;
free(pos);
//链表清空
voidList_Destory(ListNode*pos)
ListNode*head=pos,*Prev=pos-prev;
for(pos=pos-prev;head!=pos;pos=Prev)
Prev=pos-prev;
Any_delet(pos);
printf("\n清空完成\n");
}
测试
#define_CRT_SECURE_NO_WARNINGS1
#include"List.h"
voidListTest(ListNode**pphead)
ListInit(pphead);
Head_insert(*pphead,60);
Head_insert(*pphead,100);
Head_insert(*pphead,60);
Head_insert
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 郑州软件职业技术学院《数字电子技术基础A》2023-2024学年第二学期期末试卷
- 平顶山工业职业技术学院《普通话与教师语言规范》2023-2024学年第二学期期末试卷
- 杭州职业技术学院《民用建筑工程调研实训》2023-2024学年第二学期期末试卷
- 烟台城市科技职业学院《太极养生俱乐部》2023-2024学年第二学期期末试卷
- 石家庄铁道大学《电路与电子基础》2023-2024学年第二学期期末试卷
- 上海电机学院《数学教学与实践》2023-2024学年第二学期期末试卷
- 上海第二工业大学《数据挖掘技能训练》2023-2024学年第二学期期末试卷
- 辽宁商贸职业学院《地球科学概论》2023-2024学年第二学期期末试卷
- 广东云浮中医药职业学院《系统节能》2023-2024学年第二学期期末试卷
- 广州现代信息工程职业技术学院《早期接触临床》2023-2024学年第二学期期末试卷
- 《中医学》消渴-课件
- 向政府写诉求书范文(精选12篇)
- 电视节目策划学胡智峰
- 认识自我 悦纳自我 课件- 高中生心理健康主题班会
- 科技成果-秸秆清洁制浆及其废液肥料资源化利用技术
- 《社区治理研究国内外文献综述(1900字)》
- 烟花爆竹事故应急处置
- 《马克思主义与社会科学方法论》课件第四讲 社会矛盾研究方法
- 会宝岭选矿厂集中控制技术方案
- 生产车间如何节能减耗(课堂PPT)
- 2021译林版高中英语选择性必修四单词表
评论
0/150
提交评论