一郎科技|就靠这20+张图了,一口气搞懂「链表」( 六 )


}
}
循环链表和非循环链表其实创建的过程唯一不同的是 , 非循环链表的尾结点指向空 , 而循环链表的尾指针指向的是链表的开头 。
通过将单链表的尾结点指向头结点的链表称之为循环单链表(Circularlinkedlist)
一个完整的循环单链表如图:
data表示数据;
next表示指针 , 它总是指向自身的下一个结点 , 对于只有一个结点的存在 , 这个next指针则永远指向自身 , 对于一个链表的尾部结点 , next永远指向开头 。
其代码如下:
typedefstructlist{
intdata;
structlist*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=;
returnhead;
}
}
在主函数重调用可以是这样:
//////////初始化头结点//////////////
list*head=initlist;
head->next=head;
循环链表的创建操作如图所示:
通过逐步的插入操作 , 创建一个新的节点 , 将原有链表尾结点的next指针修改指向到新的结点 , 新的结点的next指针再重新指向头部结点 , 然后逐步进行这样的插入操作 , 最终完成整个单项循环链表的创建 。
其代码如下:
//创建——插入数据
intinsert_list(list*head){
intdata;//插入的数据类型
printf("请输入要插入的元素:");
scanf("%d",&data);
list*node=initlist;
node->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/data;
//初始化一个新的结点 , 准备进行链接
if(head!=){
list*p=head;
//找到最后一个数据
while(p->next!=head){
p=p->next;
}
p->next=node;
node->next=head;
return1;
}else{
printf("头结点已无元素n");
return0;
}
}
循环单链表的插入操作如图 , 对于插入数据的操作 , 可以创建一个独立的结点 , 通过将需要插入的结点的上一个结点的next指针指向该节点 , 再由需要插入的结点的next指针指向下一个结点的方式完成插入操作 。


推荐阅读