当前位置: 首页 > 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;
}

运行结果:

三、循环列表的适用范围

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

http://www.lryc.cn/news/403433.html

相关文章:

  • 深度剖析机构号矩阵系统:如何根据业务需求做出明智选择
  • go语言的基础语法
  • Modbus转Ethernet/IP网关模块与汇川PLC通讯案例
  • 【玩转python】入门篇day11-位运算
  • 【Gitlab】记一次升级 Gitlab 后 API 失效的问题
  • 2024.7.19 作业
  • python如何创建SQLite 数据库连接,如何将数据库存储在内存中?
  • 机器学习-20-基于交互式web应用框架streamlit的基础使用教程
  • 基于luckysheet实现在线电子表格和Excel在线预览
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述
  • sqlalchemy_dm
  • 基于springboot+vue+uniapp的驾校预约平台小程序
  • echarts实现3d柱状效果
  • Flask校验
  • web前端 Vue 框架面试120题(一)
  • UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据
  • 数据结构(功能受限的表-栈队列)
  • 高数知识补充----矩阵、行列式、数学符号
  • 《Techporters架构搭建》-Day01 第一个RESTful API接口
  • 【C++ —— AVL树】
  • 跨平台webSocket模块设计技术解决方案
  • Drools规则引擎
  • vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名
  • 智慧校园学期基础数据管理
  • ISP代理和双ISP代理:区别和优势
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】
  • 概率论原理精解【4】
  • Linux云计算 |【第一阶段】ENGINEER-DAY3
  • springboot 实体类加注解校验入参数据
  • 关于 Qt输入法在arm特定的某些weston下出现调用崩溃 的解决方法