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语言,循环链表一相关推荐

  1. 建立循环链表c语言,循环链表C语言实现

    按照单链表的设计,稍加改动.和单向链表不一样的地方,头节点不指向NULL,而是指向自己head 循环链表的判满 1)判断next是不是头结点,2)判断size /* * CycleLinkList.h ...

  2. 约瑟夫环问题(C语言循环链表)

    1.约瑟夫环问题(C语言循环链表) 我相信大家都可以画出这个图,知道大体的解题的思想,但是却不知道代码该怎么下手,因此,下面我直接上代码,代码中该注释的地方我都进行了注释,希望到大家有帮助: #inc ...

  3. Python创建一个循环链表、双向循环链表

    循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...

  4. 单链表、循环链表、双向循环链表总结

    链表介绍 结点的概念: 一个结点包含两个信息,一个是数据域和一个是指针域: 数据域存储该结点的数据信息 指针域存储其直接后继的位置,其示意图如下: 链表的概念: 每个结点的存储单元是独立的,若干个结点 ...

  5. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

    对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...

  6. 带头+双向+循环链表(C语言)

    文章目录 什么是带头+双向+循环链表 节点的创建 链表的初始化 打印函数 查找函数 尾插函数 尾删函数 头插函数 头删函数 在pos位置前插入 任意位置删除 销毁函数 什么是带头+双向+循环链表 带头 ...

  7. 单向循环链表C语言实现

    http://blog.csdn.net/morixinguan/article/details/51771633 我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NUL ...

  8. C语言循环链表(不带头结点)解约瑟夫问题的一种变形

    一.问题描述 约瑟夫(Joseph)问题的一种描述是:编号为 1,2,-,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个整数作为报数上限 m,从第一人开始按顺时针方向 ...

  9. 双向循环链表 (C语言实现双向循环链表) ------- 算法笔记003

    概念 我们常说的单链表是有向的链表,因为链表1中有next指针它对应指向链表2的地址 而链表2无法指向链表1,所以我们说它是单向的链表. 而双向链表则是链表1可以访问到链表2,链表2也可以访问到链表1 ...

最新文章

  1. python-回调函数和递归函数
  2. 委内瑞拉通胀这么厉害,为什么有钱人不去圈地、买房?
  3. poj 1905Expanding Rods
  4. ipv6 ospf配置方法_网络工程师(22):应用最广泛的路由协议OSPF
  5. 在win10在使用cmder代替Linux是怎样的体验
  6. 比特币被盗事件频发,这次是 6300 万美元
  7. 芒果DB删除指定日期内数据
  8. 移动边缘计算与计算卸载概述
  9. Internet Explorer无法打开internet站点文件.....操作终止
  10. 修改linu主机名后 启动tomcat服务报Unable to set localhost. This prevents creation of a GUID. Cause was: qudaogua
  11. echarts组织架构图
  12. float取小数点后四位
  13. HIT 2019春软件构造Lab1
  14. 树分治(挑战p360)
  15. eyoucms如何判断第一条和最后一条数据
  16. python之DataFrame篇
  17. [Android开发]镂空的TextView,镂空字体,TextView实现镂空字体效果
  18. 第三人称的英语作文我和我的计算机,英语作文:我的同学My Classmate
  19. 企业网/校园网网络设计涉及的关键技术详解
  20. 通过图新地球将GPS信息写入照片

热门文章

  1. 如何组织Android主屏幕以实现最佳生产力
  2. 利用ArcGIS统计各地区内路网密度(道路长度/面积)
  3. Java lang包介绍
  4. 图标优化-------IconMoon 图标制作
  5. (未完待续)浅谈微服务以及 常用中间件( zookeeper redis rabbitmq)
  6. 2021年Spring面试题70道
  7. Visual Studio 2010 中文版安装失败的解决办法
  8. 用4年多时间, 带领微软重登全球市值第一宝座, 纳德拉是如何做到的?
  9. jsplumb拖线_jsPlumb系列问题:请问jsPlumb渲染出来之后线条没有连接节点?需要拖动之后才连上...
  10. JAVA透视相机安卓,nx studio下载官方版-尼康nx studio软件v1.0.0 免费版 - 极光下载站...