循环单链表及C语言实现

本博文介绍循环单链表及其C语言的实现

循环单链表

单链表中,链表的最后一个结点的指针为NULL,每次遍历单链表都需要从头结点开始访问。

不同于单链表,循环单链表的示意图如下所示,循环单链表的尾结点的指针不为空,其指向了头结点,这样一来每次遍历单链表就不一定非得从头结点开始,从任意结点都可以遍历整个循环单链表。
循环点链表示意图
循环单链表的结构体和单链表的结构体一样:

struct node   
{  
    数据域;
    struct node *next;   
}

循环单链表的操作

插入

头结点插入

  • 链表为空
    链表为空时直接插入以进行初始化:
head=ptr;
ptr->next=head;
  • 链表非空
    循环单链表尾结点的next是指向头结点的,因此要从头结点进行插入的话必须先遍历到尾结点:
  1. 通过temp=temp->next移动到尾结点
  2. 让新结点ptrnext指向头结点
  3. 让尾结点tempnext指向新结点ptr
  4. 将新结点ptr作为头结点

示意图如下:
在这里插入图片描述

操作如下:

ptr->next=head;
temp->next=ptr;
head=ptr;

尾结点插入

  • 链表为空时的插入操作与头结点的插入操作相同
  • 链表不为空
    应先遍历到链表的尾结点,然后进行插入操作:
  1. 使用temp=temp->next遍历到尾结点
  2. 使尾结点tempnext指向新结点ptr
  3. 使新结点ptrnext结点指向头结点

示意图如下:
在这里插入图片描述

操作如下:

temp->next=ptr;
ptr->next=head;

指定位置插入

此部分与单链表的操作一致,以下为重述单链表部分的操作

  1. 应先通过temp=temp->next先移动到指定位置
  2. 使新结点ptrnext指向temp的下一部分地址
  3. tempnext指向新结点ptr即可

示意图如下:
在这里插入图片描述

操作如下:

ptr->next=temp->next;
temp->next=ptr;

删除

头结点删除

  • 只有头结点
    直接释放头结点:
head=NULL;
free(head);
  • 有多个结点
    循环单链表的尾结点的next是指向头结点的,因此应先遍历的尾结点再进行头结点的删除操作
  1. 使用temp=temp->next遍历到尾结点
  2. 使尾结点tempnext指向头结点的下一结点
  3. 头结点移动到原头结点的下一结点

示意图如下:
在这里插入图片描述

操作如下:

ptr=head;
temp->next=head->next;
head=head->next;
free(ptr);

尾结点删除

  • 只有头结点的操作与头结点删除的情况相同
  • 有多个结点
    循环单链表的尾结点的next是指向头结点的,要删除尾结点,应使尾结点的上一结点的next指向头结点,因此需要两个指针:
  1. 使用tempptr进行遍历链表,使ptr成为尾结点,temp为尾结点的上一结点
  2. tempnext指向头结点
  3. 释放尾结点ptr

示意图如下:
在这里插入图片描述
操作如下:

ptr=head;
while(ptr->next!=head){
	temp=ptr;
	ptr=ptr->next;
}
temp->next=head;
free(ptr);

指定位置删除

此部分与单链表的操作一致,以下为重述单链表部分的操作

  1. 由于为单链表,若指定位置为的结点为ptr,想删除ptr的话必须得对ptr上一位置进行操作,因此使用两个指针:pptr
  2. 通过ptr=ptr->next移动到指定位置
  3. 使指定位置的上一位置的指针p指向指定位置的下一位置
  4. 释放指定位置指针ptr

示意图如下:
在这里插入图片描述

操作如下:

移动指定步{
	p=ptr;
	ptr=ptr->next;
}
p->next=ptr->next;
free(ptr);

遍历

只要遍历到结点的next不为head就继续遍历:

while(ptr->next!=head){
	操作...
}

查找

在遍历到的数据进行比对以访问查找数据:

while(ptr->next!=head){
	比对操作...
}

循环单链表的C语言实现

以上所提到的所有操作都使用C语言进行了实现,具体代码见Github

代码的实现效果如图所示:
在这里插入图片描述

才疏学浅,难免有错误和不当之处,欢迎交流批评指正!
同时有问题的话欢迎留言或邮箱联系(ljt_IT@163.com)。

创作不易,觉得写得不错就微信扫码奖励一下吧!

Reward

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值