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

数据结构——线性表(循环链表)

一、循环链表定义

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。
循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发,访问到链表的全部结点。为了使空链表与非空链表处理一致,我们通常设一个头结点,当然,这并不是说循环链表一定要头结点,这需要注意。

二、循环列表的基本操作

循环列表的操作原理和单链表相似。

1、循环链表创建

//创建循环链表
cirLinkList LinkList_create(){cirLinkList header = (cirLinkList)malloc(sizeof(Node));header->next = header;return header;
}

2、 循环链表 插入元素

//循环链表L中第i个元素位置插入e值
int cirLinklist_insert(cirLinkList head, int i, ElemType e) {cirLinkList p = head;int j = 0;while (p && j < i){p = p->next;j++;}if(!p || j > i+1){return ERROR;}cirLinkList s = (cirLinkList)malloc(sizeof(cirLinkList));s->data = e;s->next = p->next;p->next = s;return OK;
}

3、循环链表删除元素

//循环链表L中删除第i个元素
int cirLinklist_del(cirLinkList list,int i)
{cirLinkList head = list;int j = 0;while(head && j < i){head = head->next;j++;}if(!head || j > i){return ERROR;}cirLinkList q;q = head->next;q->next = head->next->next;head->next = q->next;free(q);return OK;
}

4、循环链表 输出所有元素

//打印循环链表中所有的元素
void cirLinkList_print(cirLinkList list)
{cirLinkList head = list->next;while(head != list){printf("%d ",head->data);head = head->next;}printf("\n");
}

5、输出循环链表中指定位置的元素

// //返回L中第i个数据元素的值
ElemType cirLinkList_getElem(cirLinkList list,int i){cirLinkList p = list->next;int j = 0;while(p && j < i){p = p->next;j++;}if(!p || j > i){return ERROR;}return p->data;
}

6、销毁循环链表

//销毁循环链表
void cirLinkList_destroy(cirLinkList heard){if(heard == NULL){return;}cirLinkList p = heard->next;cirLinkList q = NULL;while(p != heard){q = p->next;free(p);p = q;}free(heard);
}

代码示例:

int main()
{cirLinkList list;list = LinkList_create();cirLinklist_insert(list,0,1);cirLinkList_print(list);cirLinklist_insert(list,0,2);cirLinkList_print(list);cirLinklist_insert(list,1,3);cirLinkList_print(list);cirLinklist_insert(list,1,4);cirLinkList_print(list);int data = cirLinkList_getElem(list,1);printf("%d \n",data);cirLinklist_del(list,1);cirLinkList_print(list);cirLinkList_destroy(list);return 0;
}

运行结果:

三、循环列表的适用范围

循环链表的优点在于可以实现循环访问和循环操作,适用于需要循环遍历的场景,比如游戏中的循环动作、循环播放音乐等。同时,循环链表也可以用于构建环形队列等数据结构。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍
  • Spring Boot 中,监听应用程序启动的生命周期事件的4种方法
  • ubuntu2204配置anacondacuda4090nvidia驱动
  • 【C#】| 与 及其相关例子
  • [Doris]阿里云搭建Doris,测试环境1FE 1BE
  • k8s学习笔记——dashboard安装
  • KAFKA搭建教程
  • 国产麒麟、UOS在线打开pdf加盖印章
  • C语言:键盘录入案例
  • Android 视频音量图标
  • 视觉巡线小车——STM32+OpenMV
  • MySQL8的备份方案——差异备份(CentOS)
  • 最新 Docker 下载镜像超时解决方案:Docker proxy
  • 【Python数据分析】数据分析三剑客:NumPy、SciPy、Matplotlib中常用操作汇总
  • R语言学习笔记10-向量-矩阵-数组-数据框-列表对比
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android 架构优化~MVP 架构改造
  • If…else
  • JavaScript 基础知识 - 入门篇(一)
  • java中具有继承关系的类及其对象初始化顺序
  • JSONP原理
  • maven工程打包jar以及java jar命令的classpath使用
  • python docx文档转html页面
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue2 SSR 的优化之旅
  • Vue2.0 实现互斥
  • vue学习系列(二)vue-cli
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从0实现一个tiny react(三)生命周期
  • 分类模型——Logistics Regression
  • 高性能JavaScript阅读简记(三)
  • 京东美团研发面经
  • 聚簇索引和非聚簇索引
  • 聊聊hikari连接池的leakDetectionThreshold
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 提醒我喝水chrome插件开发指南
  • 王永庆:技术创新改变教育未来
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # 安徽锐锋科技IDMS系统简介
  • #07【面试问题整理】嵌入式软件工程师
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (+4)2.2UML建模图
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (多级缓存)多级缓存
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (全注解开发)学习Spring-MVC的第三天
  • (四)图像的%2线性拉伸
  • **CI中自动类加载的用法总结
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)