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

【青鸟飞扬教育】“双向循环链表”学习总结和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.

相关推荐
热点推荐
大V质疑:棉花那么好怎么用不到卫生巾上?网友晒出多个品牌打脸

大V质疑:棉花那么好怎么用不到卫生巾上?网友晒出多个品牌打脸

不掉线电波
2024-12-01 12:21:34
第三个乌克兰出现?高呼“今夜即可开战”,50万士兵准备就绪

第三个乌克兰出现?高呼“今夜即可开战”,50万士兵准备就绪

猎火照狼山
2024-12-02 00:05:02
0-3!埃梅里跌下神坛:连续8场不胜 英超从第3跌第12 比曼城还惨

0-3!埃梅里跌下神坛:连续8场不胜 英超从第3跌第12 比曼城还惨

侃球熊弟
2024-12-01 23:30:22
女子将两斤泥鳅倒进下水道疏通管道 有点效果 泥鳅们还在努力

女子将两斤泥鳅倒进下水道疏通管道 有点效果 泥鳅们还在努力

闪电新闻
2024-11-21 11:59:18
大兴机场被北漂睡成“洗浴中心”,撕开当下社会最体面的一幕

大兴机场被北漂睡成“洗浴中心”,撕开当下社会最体面的一幕

这班我上够了
2024-11-30 13:50:03
网传昆明某地有小女孩捡垃圾为生,奶奶称她妈妈不要她了

网传昆明某地有小女孩捡垃圾为生,奶奶称她妈妈不要她了

小萝卜丝
2024-12-01 18:13:31
特朗普表态将对华征税不到4天,中方宣布对美豁免关税,哪些深意

特朗普表态将对华征税不到4天,中方宣布对美豁免关税,哪些深意

魏家东
2024-12-01 07:42:06
管晨辰微博遭大量批评和攻击:你也有退役的时候 给人留条活路

管晨辰微博遭大量批评和攻击:你也有退役的时候 给人留条活路

直播吧
2024-12-01 22:27:57
月薪过万,儿童成长陪伴师是育儿救星吗?

月薪过万,儿童成长陪伴师是育儿救星吗?

上观新闻
2024-11-29 09:19:21
网友:裁员的靴子终于落地,整个部门被裁!赔偿n+1,48岁该咋办

网友:裁员的靴子终于落地,整个部门被裁!赔偿n+1,48岁该咋办

火山诗话
2024-12-01 18:40:55
确认,已当场击毙!

确认,已当场击毙!

FM93浙江交通之声
2024-12-01 20:57:26
女子在中医所治疗时遭强奸!细节:双腿岔开,没穿裤子 警方:立案

女子在中医所治疗时遭强奸!细节:双腿岔开,没穿裤子 警方:立案

鋭娱之乐
2024-12-01 18:22:39
17岁中专生被企业抢着要,网友:这就是金饭碗

17岁中专生被企业抢着要,网友:这就是金饭碗

鲁中晨报
2024-12-01 17:48:22
民心不向,兵不思战!俄罗斯花5 年才收复的阿勒颇2 天就丢掉

民心不向,兵不思战!俄罗斯花5 年才收复的阿勒颇2 天就丢掉

大风文字
2024-12-01 11:29:25
香港二三四线歌手疯狂在广东演唱会,价格实惠量又足

香港二三四线歌手疯狂在广东演唱会,价格实惠量又足

港叔
2024-12-01 11:14:10
中方没给想要的台阶,立陶宛想了一周,宣布驱逐3名中国外交官

中方没给想要的台阶,立陶宛想了一周,宣布驱逐3名中国外交官

王晋博士
2024-11-30 15:50:30
网友们说出了比亚迪历年来的补贴内幕了

网友们说出了比亚迪历年来的补贴内幕了

清晖有墨
2024-12-01 18:34:46
6500亿灰飞烟灭,李斌疯魔

6500亿灰飞烟灭,李斌疯魔

投资家
2024-12-01 13:51:14
愤怒!外籍男子炫耀在上海随意约到女性甚至已婚的,因自己是白人

愤怒!外籍男子炫耀在上海随意约到女性甚至已婚的,因自己是白人

火山诗话
2024-12-01 12:18:35
俄罗斯布良斯克再遭大规模空袭!乌军F-16连击7枚导弹

俄罗斯布良斯克再遭大规模空袭!乌军F-16连击7枚导弹

项鹏飞
2024-12-01 18:40:01
2024-12-02 04:08:49
原画在线课堂vv
原画在线课堂vv
一家有温度的原画教育机构
1181文章数 1关注度
往期回顾 全部

科技要闻

我国首个商业航天发射场首发成功

头条要闻

湖南省委原常委落马后 其妻追讨5000万巨额债务引关注

头条要闻

湖南省委原常委落马后 其妻追讨5000万巨额债务引关注

体育要闻

勇士四连败,到底是谁的错?

娱乐要闻

黄晓明姥姥去世,祖孙俩手牵手好温馨

财经要闻

女首富,死刑!交出800亿,免死!

汽车要闻

科技是中国豪车梦的支点 腾势Z9走心试驾体验

态度原创

旅游
数码
房产
公开课
军事航空

旅游要闻

+现场|黄浦江首艘演艺主题游船开航

数码要闻

锐龙9000X3D加速更容易了!无需离开Windows

房产要闻

一燃再燃!又卖2亿!白鹅潭顶流,引爆全城!

公开课

一块玻璃,如何改变人类世界?

军事要闻

泽连斯基开出停火条件 俄方回应

无障碍浏览 进入关怀版