其代码如下:
typedef struct list{
int data;
struct list *next;
}list;
//data为存储的数据,next指针为指向下一个结点
循环单链表初始化先创建一个头结点并且给其开辟内存空间,在开辟内存空间成功之后,将头结点的next指向head自身,创建一个init函数来完成;
为了重复创建和插入,我们可以在init函数重新创建的结点next指向空,而在主函数调用创建之后,将head头结点的next指针指向自身 。
这样的操作方式可以方便过后的创建单链表,直接利用多次调用的插入函数即可完成整体创建 。
其代码如下:
//初始结点
list *initlist{
list *head=(list*)malloc(sizeof(list));
if(head==){
printf("创建失败,退出程序");
exit(0);
}else{
head->next=;
return head;
}
}
在主函数重调用可以是这样:
//////////初始化头结点//////////////
list *head=initlist;
head->next=head;
循环链表的创建操作如图所示:

文章插图
单向循环链表的创建
通过逐步的插入操作,创建一个新的节点,将原有链表尾结点的next指针修改指向到新的结点,新的结点的next指针再重新指向头部结点,然后逐步进行这样的插入操作,最终完成整个单项循环链表的创建 。
其代码如下:
//创建——插入数据
int insert_list(list *head){
int data; //插入的数据类型
printf("请输入要插入的元素:");
scanf("%d",&data);
list *node=initlist;
node->data=https://www.isolves.com/it/cxkf/bk/2020-08-31/data;
//初始化一个新的结点,准备进行链接
if(head!=){
list *p=head;
//找到最后一个数据
while(p->next!=head){
p=p->next;
}
p->next=node;
node->next=head;
return 1;
}else{
printf("头结点已无元素n");
return 0;
}
}
循环单链表的插入操作如图,对于插入数据的操作,可以创建一个独立的结点,通过将需要插入的结点的上一个结点的next指针指向该节点,再由需要插入的结点的next指针指向下一个结点的方式完成插入操作 。

文章插图
其代码如下:
//插入元素
list *insert_list(list *head,int pos,int data){
//三个参数分别是链表,位置,参数
list *node=initlist; //新建结点
list *p=head; //p表示新的链表
list *t;
t=p;
node->data=https://www.isolves.com/it/cxkf/bk/2020-08-31/data;
if(head!=){
for(int i=1;i<pos;i++){
t=t->next; //走到需要插入的位置处
}
node->next=t->next;
t->next=node;
return p;
}
return p;
}
循环单链表的删除操作如下图所示,循环单链表的删除操作是先找到需要删除的结点,将其前一个结点的next指针直接指向删除结点的下一个结点即可 。
需要注意的是尾结点,因为删除尾节点后,尾节点前一个结点就成了新的尾节点,这个新的尾节点需要指向的是头结点而不是空 。

文章插图
其代码如下:
//删除元素
int delete_list(list *head) {
if(head == ) {
printf("链表为空!n");
return 0;
}
//建立临时结点存储头结点信息(目的为了找到退出点)
//如果不这么建立的化需要使用一个数据进行计数标记,计数达到链表长度时自动退出
//循环链表当找到最后一个元素的时候会自动指向头元素,这是我们不想让他发生的
list *temp = head;
list *ptr = head->next;
int del;
printf("请输入你要删除的元素:");
scanf("%d",&del);
while(ptr != head) {
if(ptr->data =https://www.isolves.com/it/cxkf/bk/2020-08-31/= del) {
if(ptr->next == head) {
temp->next = head;
free(ptr);
return 1;
}
temp->next = ptr->next; //核心删除操作代码
free(ptr);
//printf("元素删除成功!n");
return 1;
}
temp = temp->next;
ptr = ptr->next;
}
printf("没有找到要删除的元素n");
return 0;
推荐阅读
- 「OOM」Java heap space原因与解决
- 「网络特效」12 个炫酷背景特效库
- 日本和果子「水信玄饼」的做法
- Github上复旦小姐姐原创「数据结构和算法系列」
- 一篇文章搞懂热修复类加载方案原理
- 2 「系统架构」如何使用Dockerfile制作Docker容器?
- 苦瓜茶的好处,苦瓜茶的副作用
- 「PHP编程」安装开发环境太烦?告诉你几个简单方法,分分钟搞定
- 百度搜索上线「工具特型卡」公开招募工具类智能小程序
- HTML5 绘图技术 「Canvas」和「SVG」
