线性表--循环链表、双向链表

本文深入探讨了循环链表和双向链表的概念,包括它们的结构特点、操作方法以及与单链表的区别。详细讲解了循环链表的合并过程,双向链表的插入和删除操作,并提供了具体实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇提到的单链表是否能从一个结点出发访问链表的全部结点?

上一篇见:线性表----顺序存储、单链表、静态链表 https://blog.youkuaiyun.com/heda3/article/details/81437052

答案:不能

1.为此引出循环链表(单循环链表circular linked list),相比于单链表的区别是将单链表的头尾相连接即可。

两种类型:头指针和尾指针

尾指针有优势一些,访问第一或最后一个指针都是O(1)

两个链表的合并:

 关键的点是:

//将B的头结点去掉
p=rearA->next;//将A尾结点指向的头结点给缓存结点p
rearA->next=rearB->next->next;//将B头结点指向的下一个结点的地址赋值给A表的尾结点
rearB->next=p;//将A尾结点指向的头结点的地址赋值给B的的尾结点
free(p)

也就是说:将A的尾巴指向B的头的下一个位置,再将B的尾巴指向A的头。

从尾到头打印链表和尾指针的循环链表操作类似!不对,和单链表的插入操作(头插和尾插有关)

2.双向链表:(double linked list)相比单链表,多了一个指向前驱结点的指针域

也即是有两个指针域

//结构
typedef struct DulNOde
{
 ElemType data;
 struct DuLNode *prior;
 Struct DuLNode *next;
}DulNode,*DuLinkList;

p->next->prior=p=p->prior->next;

插入操作:

s->prior=p;
s-next=p->next;
p->next->prior=s;
p->next=s;
//关键的一点是最后一句放到前面会导致错乱,但是前面3句如果改变顺序会有影响吗?
一般的顺序是,插入点s的前驱和后继先搞,再搞后结点的前驱,再搞前结点的后继

删除操作:

p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
//理解是:先将后结点的位置给前结点的后继指针,再是前结点的位置给后结点的前驱指针,实现互相指向

对比下单链表的删除操作;

https://blog.youkuaiyun.com/heda3/article/details/81437052

单链表的删除

//在第i个位置之前插入新的数据元素e
Status ListInsert(LinkList *L,int i,ElemType e)
{
 
int j;
LinKList p,q;//为要删除的结点
p=*L;
j=1;
while(p&&j<i)
 {
 p=p->next;
 ++j;
 }
 
if(!p||j>i)
{
 return ERROR;
}
q=p->next;//q为要删除结点的缓存变量 将指针赋值给它
p->next=q->next;//起到断开连接作用
*e=q->data;//数据赋值给指针e
free(q);
return ok;
 
}

参考:《大话数据结构》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heda3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值