网易首页 > 网易号 > 正文 申请入驻

【青鸟飞扬教育】“双向循环链表”学习总结和C语言代码实现!

0
分享至

双向循环链表

定义

双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表。只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿,如图所示:



需要注意的是,虽然双向循环链表成环状,但本质上还是双向链表,因此在双向循环链表中,依然能够找到头指针和头节点等。双向循环链表和双向链表相比,唯一的不同就是双向循环链表首尾相连,其他都完全一样。

注意:因为我上面已经讲了双向链表,所以这里只注重讲他们的实现差异。另因为带头节点会更好操作,所以我的代码都有头节点。

1、双向循环链表的创建

初始化时需要将头节点的next和prior都指向自己。



//1、初始化双向循环链表(带头节点)Status initLinkList(LinkList *list){ //创建头节点 *list = malloc(sizeof(Node)); if (*list == NULL) { return ERROR; } //前驱和后继都指向自己 (*list)->prior = *list; (*list)->data = -1; (*list)->next = *list; printf("已初始化链表~\n"); return OK;}

2、遍历双向循环链表

注意它的尾节点的next不再是Null,而是头节点

//2、遍历双向循环链表void printfLinkLisk(LinkList list){ printf("遍历链表:\n"); if (list == NULL || list->next == list) { printf("这是一个空链表\n"); return; } LinkList p = list; //判断next是否全部正确 printf("根据next从前往后遍历:"); while (p->next != list) { printf("%d ",p->next->data); p = p->next; } printf("\n"); //判断prior是否全部正确 printf("根据prior从后往前遍历:"); while (p != list) { printf("%d ",p->data); p = p->prior; } printf("\n");}

3、根据索引位置添加节点

这里不需要判断尾节点的next是否为Null,因为它会指向头节点。

//3、根据索引位置插入数据至链表中Status insertLinkList(LinkList *list, int index, ElemType data){ if (list == NULL || index < 0) { return ERROR; } int i = 0; LinkList priorNode = *list; //判断插入的位置,这里开始位置是0,index超过链表长度则插入末尾 while (i < index && priorNode->next != *list) { priorNode = priorNode->next; i++; } LinkList newNode = malloc(sizeof(Node)); if (newNode == NULL) { return ERROR; } newNode->data = data; //插入操作共四步,看好了,别眨眼 //1.将priorNode->next节点的前驱指向新节点 priorNode->next->prior = newNode; //2.将新节点->next指向原来的priorNode->next newNode->next = priorNode->next; //3.将priorNode->next指向新节点 priorNode->next = newNode; //4.新节点的前驱指向priorNode newNode->prior = priorNode; return OK;}

4、根据索引位置删除节点

这里不需要判断尾节点的next是否为Null,因为它会指向头节点。

//4、根据索引位置删除节点Status deleteLinkListByIndex(LinkList *list, int index, ElemType *data){ if (*list == NULL || index < 0) { return ERROR; } LinkList locaNode = *list; int i = 0; //注意别删了头节点 while (i <= index) { locaNode = locaNode->next; if (locaNode == *list) { printf("没有这个你想要删除的节点\n"); return ERROR; } i++; } //开始删除,只需要做两步 locaNode->prior->next = locaNode->next; locaNode->next->prior = locaNode->prior; *data = locaNode->data; free(locaNode); return OK;}

5、根据存储的值删除节点

这里不需要判断尾节点的next是否为Null,因为它会指向头节点。

//5、根据存储的值删除节点Status deleteLinkListByData(LinkList *list, ElemType data){ if (*list == NULL) { return ERROR; } LinkList locaNode = (*list)->next; while (locaNode != *list) { if (locaNode->data == data) { break; } locaNode = locaNode->next; } if (locaNode == *list) { printf("没有这个你想要删除的节点\n"); return ERROR; } //开始删除,只需要做两步 locaNode->prior->next = locaNode->next; locaNode->next->prior = locaNode->prior; free(locaNode); return OK;}

6、根据值查找节点

尾节点的next可是头节点哦,找到它就是最后一个了。

//6、查找元素Status selectNode(LinkList list, ElemType data, LinkList *locaNode){ if (list == NULL) { return ERROR; } LinkList p = list->next; while (p != list) { if (p->data == data) { *locaNode = p; break; } p = p->next; } if (*locaNode == NULL) { printf("没有这个你想要的节点\n"); return ERROR; } else { return OK; }}

其它辅助代码

#include "stdlib.h"#define OK 1#define ERROR 0//元素类型typedef int ElemType;//状态类型typedef int Status;//定义节点结构体typedef struct Node { struct Node *prior; ElemType data; struct Node *next;} Node;typedef Node *LinkList;int main(int argc, const char * argv[]) { LinkList list; initLinkList(&list); for (int i = 0; i < 10; i ++) { insertLinkList(&list, i, i); } printfLinkLisk(list); int index, data; printf("输入你想插入的位置(从0开始)和存储的值:"); scanf("%d %d",&index,&data); insertLinkList(&list, index, data); printfLinkLisk(list); printf("输入你想删除的位置(从0开始):"); scanf("%d",&index); deleteLinkListByIndex(&list, index, &data); printfLinkLisk(list); printf("输入你想删除的节点的值(只删最前的那个):"); scanf("%d",&data); deleteLinkListByData(&list, data); printfLinkLisk(list); printf("\n"); return 0;}

输出结果:



特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
俄罗斯飞机的粗糙令观众目瞪口呆

俄罗斯飞机的粗糙令观众目瞪口呆

花椒先声
2024-11-05 15:03:18
广东女子因吃一物要终生透析?医生多次劝告:这3物真的要少吃

广东女子因吃一物要终生透析?医生多次劝告:这3物真的要少吃

荷兰豆爱健康
2024-11-06 17:06:38
名记:7胜1负没有让勇士感到满足,管理层仍在探索交易补强的可能

名记:7胜1负没有让勇士感到满足,管理层仍在探索交易补强的可能

鸡丁侃球
2024-11-08 05:45:05
官方已“拉黑”海马体照片,2024考研明确规定,女大学生坐不住了

官方已“拉黑”海马体照片,2024考研明确规定,女大学生坐不住了

妍妍教育日记
2024-11-06 18:31:06
这些老师,都是吃饱了撑的?!

这些老师,都是吃饱了撑的?!

燕梳楼频道
2024-11-07 18:42:06
男子醉酒后与女领导睡觉,因没有反抗,最终判男方无罪释放

男子醉酒后与女领导睡觉,因没有反抗,最终判男方无罪释放

那年的春夏
2024-11-06 22:39:22
火箭和雷霆之战,如何取胜,火箭打这种天赋型球队都有的打

火箭和雷霆之战,如何取胜,火箭打这种天赋型球队都有的打

mvpmade
2024-11-08 07:09:02
内鬼被揪出,伊朗人民万万没想到,奸细竟是外表忠心耿耿高官!

内鬼被揪出,伊朗人民万万没想到,奸细竟是外表忠心耿耿高官!

现代春秋
2024-10-14 14:57:52
狐狸尾巴藏不住?特朗普立誓:若我当上总统,一定拆散中俄两国

狐狸尾巴藏不住?特朗普立誓:若我当上总统,一定拆散中俄两国

历史有些冷
2024-11-07 17:00:02
特朗普将清算哈里:叛徒不该被原谅

特朗普将清算哈里:叛徒不该被原谅

悦居英国
2024-11-08 05:49:12
欧联杯积分榜:拉齐奥全胜领跑,曼联升至第15位

欧联杯积分榜:拉齐奥全胜领跑,曼联升至第15位

懂球帝
2024-11-08 06:14:32
“是我垫付了买瓦良格的钱, 荣誉却全让他占了”

“是我垫付了买瓦良格的钱, 荣誉却全让他占了”

李律讲法
2024-10-28 18:40:02
俄罗斯极品超模!这身材,真的顶不住!

俄罗斯极品超模!这身材,真的顶不住!

打麻将的仔
2024-11-06 08:10:59
懵!女子遭3名男子强行塞进商务车带往广东!趁对方睡觉偷偷求助!

懵!女子遭3名男子强行塞进商务车带往广东!趁对方睡觉偷偷求助!

广东吃喝玩乐
2024-11-07 22:50:16
公诉人杜撰录音内容当庭被戳穿,竟说是自己“总结”出来的

公诉人杜撰录音内容当庭被戳穿,竟说是自己“总结”出来的

景来律师
2024-11-07 19:09:11
蜂花就发布不当图文内容道歉:存在严重漏洞,已启动整改

蜂花就发布不当图文内容道歉:存在严重漏洞,已启动整改

封面新闻
2024-11-07 15:06:08
中国篮球短视 2米20女姚明无缘留洋太可惜 吊打国内同龄人无意义

中国篮球短视 2米20女姚明无缘留洋太可惜 吊打国内同龄人无意义

厝边人侃体育
2024-11-08 10:30:54
血糖高不高,上厕所就知道?医生:尿液的3个变化是重要信号

血糖高不高,上厕所就知道?医生:尿液的3个变化是重要信号

39健康网
2024-11-05 20:31:00
国锦赛爆冷!徐思逆转绝杀威尔逊,中国小将闯进四强将战丁俊晖!

国锦赛爆冷!徐思逆转绝杀威尔逊,中国小将闯进四强将战丁俊晖!

世界体坛观察家
2024-11-08 00:08:06
周雨彤翻车,才知道她当年多嚣张才会开车进故宫,网友:封杀!

周雨彤翻车,才知道她当年多嚣张才会开车进故宫,网友:封杀!

史诗长歌
2024-10-31 03:40:03
2024-11-08 11:16:49
原画在线课堂vv
原画在线课堂vv
一家有温度的原画教育机构
1069文章数 1关注度
往期回顾 全部

科技要闻

奥迪新品牌:告别四环,告别传统

头条要闻

媒体:特朗普当选对中国突破美国编织的战略围墙是利好

头条要闻

媒体:特朗普当选对中国突破美国编织的战略围墙是利好

体育要闻

郑钦文又跳一级:打出本赛季最好的网球

娱乐要闻

鹿晗删除宣传关晓彤新剧微博引争议!

财经要闻

特朗普2.0时代,A股拒绝“历史重演”!

汽车要闻

用魔法打败魔法 银河星舰7 EM-i这回量大管饱

态度原创

数码
艺术
旅游
亲子
时尚

数码要闻

八位堂推出全配列复古三模机械键盘 Retro 108,随附一对超级按键

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

旅游要闻

立冬当天穿秋裤免门票 洛阳一景点推出暖心福利

亲子要闻

宝宝不要妈妈帮他脱袜子盖被子,自己拿起小被子往头上捂

双十一优惠合集来了

无障碍浏览 进入关怀版