当前位置: 首页 > news >正文

单向循环链表超详细精讲 | 带头节点带头指针 + 完整可运行c语言代码

文章目录

  • 单向循环链表
    • 1.带头节点的单向循环链表
      • 前置知识
        • ==1.插入相关==
          • 1.1头插
          • 1.2 尾插
        • ==2.删除相关==
      • 头文件部分
      • 实现
        • 1.初始化接口
        • 2.头插
        • 3.尾插
        • 4.遍历显示
        • 5.删除节点
        • 6.释放整个数据域 不释放头(头置空)
        • 测试案例
        • main函数
        • 输出结果
    • 2.带头指针的单向循环链表

单向循环链表

1.带头节点的单向循环链表

前置知识

所谓单向循环链表就是在普通单向链表基础上,把最后一个节点的 next 指针不再置为 NULL,而是指向链表第一个节点(头节点/首元节点)

​ 先展示下链表的样子(这里我加了了个count 给写成了结构体) (count用来统计链表中的节点数量)

1.插入相关
1.1头插
1.创建新节点 2.更新新节点 3.更新头节点 4.更新尾指针(只有在第一次插入时候)
  1. 创建新节点 ------>link_loop *new_node = malloc(sizeof(link_loop));

  1. 更新新节点 ------>new_node->next = link_loop->header.next;

  1. 更新头节点 ------>link_loop->header.next = new_node;

  1. 更新尾指针(只有在第一次插入时候) ------>link_loop->rear = new_node;

1.创建新节点 2.更新新节点 3.更新头节点 4.更新尾指针(只有在第一次插入时候)
link_loop*new_node=malloc(sizeof(link_loop));//其实这里也展现了我们在 单链表 中所说的 备份思想new_node->next=link_loop->header.next;link_loop->header.next=new_node;if(link_loop->rear==&link_loop->header){link_loop->rear=new_node;}
1.2 尾插
1.创建新节点 2.更新新节点 3.更新尾指针的next 3.更新尾指针
  1. 创建新节点 ------>LoopNode *new_node = malloc(sizeof(LoopNode));

  2. 更新新节点 ------>new_node->next = link_loop->rear->next;

  1. 更新尾指针的next ------>link_loop->rear->next = new_node;

  2. 更新尾指针 ------>link_loop->rear = new_node;

1.创建新节点 2.更新新节点 3.更新尾指针的next 3.更新尾指针
LoopNode*new_node=malloc(sizeof(LoopNode));//其实这里也展现了我们在 单链表 中所说的 备份思想new_node->next=link_loop->rear->next;link_loop->rear->next=new_node;link_loop->rear=new_node;
2.删除相关
其实这里的删除和单链表那里的删除完全一样!!! 1.引入辅助指针p,p找到待删除位置的前一个节点 2.引入辅助指针备份待删除位置 tmp 3.修改前驱节点的 next 指针,跳过待删除节点,重新衔接链表 4.删除tmp
  1. 引入辅助指针p,p找到待删除位置的前一个节点 ------>LoopNode *p = 前驱节点

  2. 引入辅助指针备份待删除位置 tmp ------>LoopNode *tmp = p->next;

  3. 修改前驱节点的 next 指针,跳过待删除节点,重新衔接链表 ------>p->next = tmp->next;

  4. 删除tmp ------>free(tmp);

1.引入辅助指针p,p找到待删除位置的前一个节点 2.引入辅助指针备份待删除位置 tmp 3.修改前驱节点的 next 指针,跳过待删除节点,重新衔接链表 4.删除tmp
LoopNode*p=前驱节点 LoopNode*tmp=p->next;p->next=tmp->next;free(tmp);

头文件部分

typedefintElement;typedefstruct_loop_node{Element val;struct_loop_node*next;}LoopNode;//定义单向循环链表的头结构typedefstruct{LoopNode header;LoopNode*rear;intnum;}LinkLoopList;//1.初始化接口voidinitLinkLoopList(LinkLoopList*link_loop);//2.头插intinsertLinkLoopHeader(LinkLoopList*link_loop,Element value);//3.尾插intinsertLinkLoopRear(LinkLoopList*link_loop,Element value);//4.遍历显示voidshowLinkLoopList(constLinkLoopList*link_loop);//5.删除节点intdeleteLinkLoopList(LinkLoopList*link_loop,Element value);//6.释放整个数据域 不释放头(头置空)voiddestroyLinkLoopList(LinkLoopList*link_loop);

实现

1.初始化接口
voidinitLinkLoopList(LinkLoopList*link_loop){//刚开始就是自己指自己link_loop->header.next=link_loop->rear=&link_loop->header;//表中的节点数量为0link_loop->num=0;}
2.头插
intinsertLinkLoopHeader(LinkLoopList*link_loop,Element value){//1 先有新节点LoopNode*node=malloc(sizeof(LoopNode));if(node==NULL){return-1;}//插入代码node->val=value;node->next=link_loop->header.next;link_loop->header.next=node;//判断尾指针是否需要更新if(link_loop->rear==&link_loop->header){link_loop->rear=node;}//增加链表中节点的数量++link_loop->num;return0;}
3.尾插
intinsertLinkLoopRear(LinkLoopList*link_loop,Element value){//1 先有新节点LoopNode*node=malloc(sizeof(LoopNode));if(node==NULL){return-1;}//插入代码node->val=value;node->next=link_loop->rear->next;link_loop->rear->next=node;link_loop->rear=node;//增加链表中节点的数量++link_loop->num;return0;}
4.遍历显示
voidshowLinkLoopList(constLinkLoopList*link_loop)//这里加const 因为是只读{//引入辅助指针nodeLoopNode*node=link_loop->header.next;//单向循环链表 首尾相连while(node!=&link_loop->header){printf("%d ",node->val);//不断向后遍历node=node->next;}printf("\n");}
5.删除节点
intdeleteLinkLoopList(LinkLoopList*link_loop,Element value){//引入辅助指针nodeLoopNode*node=&link_loop->header;//找到待删除位置的前一个节点while(node->next!=&link_loop->header&&node->next->val!=value){node=node->next;}//删除代码if(node->next->val==value){LoopNode*temp=node->next;node->next=temp->next;free(temp);//减少链表中节点的数量--link_loop->num;}//没找到要删除的节点else{printf("NO %d element!\n",value);}return0;}
6.释放整个数据域 不释放头(头置空)
voiddestroyLinkLoopList(LinkLoopList*link_loop){//引入辅助节点nodeLoopNode*node=link_loop->header.next;while(node!=&link_loop->header){//删除代码LoopNode*tmp=node;node=node->next;free(tmp);--link_loop->num;}//最后删除完毕 打印链表中的节点数量printf("Table %d element!\n",link_loop->num);//头置空link_loop->rear=NULL;link_loop->header.next=NULL;}
测试案例
main函数
voidtest03(){LinkLoopList table;//初始化表initLinkLoopList(&table);//循环尾插for(inti=0;i<10;i++){insertLinkLoopRear(&table,i+100);}//头插insertLinkLoopHeader(&table,520);//遍历展示showLinkLoopList(&table);printf("=======================\n");//删除节点deleteLinkLoopList(&table,100);//遍历展示showLinkLoopList(&table);//销毁该表的元素区域 头置空destroyLinkLoopList(&table);}intmain(){test03();return0;}
输出结果
520100101102103104105106107108109=======================520101102103104105106107108109Table0element!

2.带头指针的单向循环链表

​ 经过上面的带头节点的单向循环链表的理解 这个可以说非常简单了
​ 我们可以延用在单链表中所讲的(具体参考主页数据结构专栏)最万金油的思路

引入辅助节点,充当头节点

​ 嘻嘻嘻嘻 单向循环链表部分到此结束😆😆

​ (有错误欢迎指出) (疑问也是)❤️❤️😍😍💖💖

http://www.zskr.cn/news/1439571.html

相关文章:

  • 保姆级教程:在Ubuntu 20.04上从源码编译运行ORB-SLAM3(含ROS1/ROS2配置)
  • 设计模式深度解析:从六大原则到Spring源码,面试通关全攻略
  • 基于YOLOv8的美国手语手势检测系统 美国手语手势检测数据集训练及应用
  • 保姆级教程:用Python和PyTorch从零搭建一个行人重识别(ReID)原型系统
  • UE图层混合地形材质
  • ShardingSphere启动慢?别急着升级,先试试调大这个隐藏参数(附源码解析)
  • 别再只画激活图了!用BrainNet Viewer和FSL玩转fMRI脑网络可视化
  • MATLAB App Designer打包后,安装包里到底有啥?带你深度解析三个文件夹的用途
  • Win10用户目录迁移翻车实录:我踩过的三个坑和最终解决方案
  • 面试邀约率太低?2026年8个简历模板网站推荐:直接填内容就能用
  • OpenCore Legacy Patcher终极指南:深度解析老旧Mac升级最新macOS的3大核心技术突破
  • 2025-2026年25-30万家用SUV车型推荐:五大评测长途自驾性价比高特点注意事项 - 品牌推荐
  • 别再死记硬背UML类图了!用Java/Spring Boot实战案例,5分钟搞懂依赖、关联、聚合与组合
  • 基于稀疏判别集成学习的EEG情绪识别:自动通道选择与高效分类
  • 手把手教你用STM32F103的普通IO口读取SSI编码器(附差分电平转换模块接线)
  • AI生成视频与数字人
  • 冀州GEO优化公司|企业知识库升级维护,冀州AI搜索优化服务商选择指南 - 招财兔数字员工
  • ARC211
  • C51中断服务程序中的局部变量使用与优化
  • BI与AI融合:从数据报表到智能决策的实践路径
  • 温州乐清虹桥幼小衔接幼儿园综合实力排行 - 奔跑123
  • 2026 江苏镇江市(全区域服务)本地人必选彩钢瓦金属屋面防水防腐公司避坑指南 TOP5 推荐 - 本地便民网
  • 数据科学自由职业:5步构建个人品牌与稳定获客体系
  • 丙午年六一感怀
  • DuQuant++:针对MXFP4激活异常值的块对齐旋转量化优化方案
  • 从零到播放:手把手教你用LiveCMS+LiveSMS搭建一个可用的GB28181视频监控测试环境
  • 若依RuoYi-Vue项目实战:手把手教你集成微信小程序OpenID免密登录(Spring Security改造避坑)
  • 2026年最新德州市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 杭州奢侈品包包回收排行榜,2026 金榜商家合扬诚信回收 - 合扬奢侈品交易中心
  • 告别数据标注!用Hugging Face的CLIP模型,5分钟搞定零样本图片分类(附完整代码)