构建循环链表c语言,循环链表一
1. 循环链表概念
对于单链表以及双向链表,其就像一个小巷,无论怎么样最终都能从一端走到另一端,然而循环链表则像一个有传送门的小巷,因为循环链表当你以为你走到结尾的时候,其实你又回到了开头。
循环链表和非循环链表其实创建的过程以及思路几乎完全一样,唯一不同的是,非循环链表的尾结点指向空(NULL),而循环链表的尾指针指向的是链表的开头。通过将单链表的尾结点指向头结点的链表称之为循环单链表(Circular linkedlist)
如图,为一个完整的循环单链表
2. 循环链表结点设计(以单循环链表为例)
对于循环单链表的结点,可以完全参照于单链表的结点设计,如图:
data表示数据,其可以是简单的类型(如int,double等等),也可以是复杂的结构体(struct类型)
next表示指针,它永远指向自身的下一个结点,对于只有一个结点的存在,这个next指针则永远指向自身,对于一个链表的尾部结点,next永远指向开头。
其代码可以表示为:typedef struct list{
int data;
struct list *next;
}list;
//data为存储的数据,next指针为指向下一个结点
3. 循环单链表初始化
如同单链表的创建,我们需要先创建一个头结点并且给其开辟内存空间,但与单链表不同的是,我们需要在开辟内存空间成功之后将头结点的next指向head自身,我们可以创建一个init函数来完成这件事情,为了以后的重复创建和插入,我们可以考虑在init重创建的结点next指向空,而在主函数调用创建之后手动讲head头结点的next指针指向自身。
这样的操作方式可以方便过后的创建单链表,直接利用多次调用的插入函数即可完成整体创建。
其代码可以表示为://初始结点
list *initlist(){
list *head=(list*)malloc(sizeof(list));
if(head==NULL){
printf("创建失败,退出程序");
exit(0);
}else{
head->next=NULL;
return head;
}
}
在主函数重调用可以是这样在主函数重调用可以是这样
//初始化头结点//
list *head=initlist();
head->next=head;
4. 循环链表的创建操作
如图所示:
我们可以通过逐步的插入操作,创建一个新的节点,将原有链表尾结点的next指针修改指向到新的结点,新的结点的next指针再重新指向头部结点,然后逐步进行这样的插入操作,最终完成整个单项循环链表的创建。
其代码可以表示为://创建——插入数据
int insert_list(list *head){
int data; //插入的数据类型
printf("请输入要插入的元素:");
scanf("%d",&data);
list *node=initlist();
node->data=data;
//初始化一个新的结点,准备进行链接
if(head!=NULL){
list *p=head;
//找到最后一个数据
while(p->next!=head){
p=p->next;
}
p->next=node;
node->next=head;
return 1;
}else{
printf("头结点已无元素\n");
return 0;
}
}
构建循环链表c语言,循环链表一相关推荐
- 建立循环链表c语言,循环链表C语言实现
按照单链表的设计,稍加改动.和单向链表不一样的地方,头节点不指向NULL,而是指向自己head 循环链表的判满 1)判断next是不是头结点,2)判断size /* * CycleLinkList.h ...
- 约瑟夫环问题(C语言循环链表)
1.约瑟夫环问题(C语言循环链表) 我相信大家都可以画出这个图,知道大体的解题的思想,但是却不知道代码该怎么下手,因此,下面我直接上代码,代码中该注释的地方我都进行了注释,希望到大家有帮助: #inc ...
- Python创建一个循环链表、双向循环链表
循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...
- 单链表、循环链表、双向循环链表总结
链表介绍 结点的概念: 一个结点包含两个信息,一个是数据域和一个是指针域: 数据域存储该结点的数据信息 指针域存储其直接后继的位置,其示意图如下: 链表的概念: 每个结点的存储单元是独立的,若干个结点 ...
- c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...
- 带头+双向+循环链表(C语言)
文章目录 什么是带头+双向+循环链表 节点的创建 链表的初始化 打印函数 查找函数 尾插函数 尾删函数 头插函数 头删函数 在pos位置前插入 任意位置删除 销毁函数 什么是带头+双向+循环链表 带头 ...
- 单向循环链表C语言实现
http://blog.csdn.net/morixinguan/article/details/51771633 我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NUL ...
- C语言循环链表(不带头结点)解约瑟夫问题的一种变形
一.问题描述 约瑟夫(Joseph)问题的一种描述是:编号为 1,2,-,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个整数作为报数上限 m,从第一人开始按顺时针方向 ...
- 双向循环链表 (C语言实现双向循环链表) ------- 算法笔记003
概念 我们常说的单链表是有向的链表,因为链表1中有next指针它对应指向链表2的地址 而链表2无法指向链表1,所以我们说它是单向的链表. 而双向链表则是链表1可以访问到链表2,链表2也可以访问到链表1 ...
最新文章
- python-回调函数和递归函数
- 委内瑞拉通胀这么厉害,为什么有钱人不去圈地、买房?
- poj 1905Expanding Rods
- ipv6 ospf配置方法_网络工程师(22):应用最广泛的路由协议OSPF
- 在win10在使用cmder代替Linux是怎样的体验
- 比特币被盗事件频发,这次是 6300 万美元
- 芒果DB删除指定日期内数据
- 移动边缘计算与计算卸载概述
- Internet Explorer无法打开internet站点文件.....操作终止
- 修改linu主机名后 启动tomcat服务报Unable to set localhost. This prevents creation of a GUID. Cause was: qudaogua
- echarts组织架构图
- float取小数点后四位
- HIT 2019春软件构造Lab1
- 树分治(挑战p360)
- eyoucms如何判断第一条和最后一条数据
- python之DataFrame篇
- [Android开发]镂空的TextView,镂空字体,TextView实现镂空字体效果
- 第三人称的英语作文我和我的计算机,英语作文:我的同学My Classmate
- 企业网/校园网网络设计涉及的关键技术详解
- 通过图新地球将GPS信息写入照片
热门文章
- 如何组织Android主屏幕以实现最佳生产力
- 利用ArcGIS统计各地区内路网密度(道路长度/面积)
- Java lang包介绍
- 图标优化-------IconMoon 图标制作
- (未完待续)浅谈微服务以及 常用中间件( zookeeper redis rabbitmq)
- 2021年Spring面试题70道
- Visual Studio 2010 中文版安装失败的解决办法
- 用4年多时间, 带领微软重登全球市值第一宝座, 纳德拉是如何做到的?
- jsplumb拖线_jsPlumb系列问题:请问jsPlumb渲染出来之后线条没有连接节点?需要拖动之后才连上...
- JAVA透视相机安卓,nx studio下载官方版-尼康nx studio软件v1.0.0 免费版 - 极光下载站...