双向、循环链表

在双向链表的结点中有两个指针域,其一指向直接后继,另一个指向直接前趋

1. 线性表的双向链表存储结构

typedef struct DulNode{

struct DulNode *prior;

ElemType data;

struct DulNode *next;

}DulNode,*DuLinkList;

对指向双向链表任一结点的指针d ,有下面的关系:

d->next->prior=d->prior->next=d;

即:当前结点后继的前趋是自身,当前结点前趋的后继也是自身。

2.双向链表的插入操作:(很遗憾,图片传不上来),不过记住四步:

基本原理:双链表就好像是手拉手站成一排的人,每个人的右手(next)拉着下一个人,左手(prior)拉着前一个人,每两个人之间有两只手互联,插入操作实际是队伍中增加人员,他需要拉上左右两边人的手,即共三个人要发生关系,由于每个人之间有两只手互联,所以要发生四次操作:如已知结点

p、q需要插入s(称为原型吧)

--------------------------------------

q->next

<----

   p

p->prior

---------------------------------------

现在假设需要插入结点s,则需要进行以下4次操作:

(1)(2)完成q 与s的握手

(1)q->next = s;

(2)s->prior=q;

q->next

--->

  s

<---

s->prior

--------------------------------------

(3)(4)完成s 与q 的握手

(3)s->next = p;

(4)p->prior = s;

q->next s->next

--> -->

 s   p

<-- <--

s->prior p->prior

对于上面的Sample,只已知结点p,而不致结点q,但是通过双向链表的性质我们可以在初始时(插入前)得到以下关系:p->prior = q;

所以对于以上的4次操作我们可以作等效操作,即将q换为p->prior,则以上4次操作为:

p->prior->next = s;

s->prior = p->prior;

s->next = p;

p->prior = s;

 3. 双向链表的呼唤问题

由于不知道q 结点,因此用p->prior 来代替,所以p->prior 的值应当在已经不再使用q 结点的时候再改变,由原型:

(1)q->next = s;

(2)s->prior = q;

(3)s->next = p;

(4)p->prior = s;

4.删除操作

基本原理:删除操作就好像某个人退出队伍,但退出前他需要让他两边的人把手拉上,以保持队伍的连续性,如已知q、s、p,需要删除s ,由于只需要两个人发生关系,所以需要进行以下两次操作:

(1)q->next=p;

(2)p->prior=q;

q->next  s->next

 s   p

<-- <--

s->prior p->prior

 

q->next

-->

 p

<--

p->prior

对于本例,是上面原型的变种,只已知s ,但由双向链表的性质,我们可以推出以下关系:

q == s->prior;

p == s->next;

因此可做以下替换:

(1)s->prior->next = s->next;

(2)s->next->prior = s->prior;

由于s ,以及prior和next的值在两次操作中并没有被改变,因此(1)(2)的顺序没有关系.
三、一些结论
  (1)对于双向链表的插入,只需知道插入位置的一个节点即可完成插入;
    (2)对于双向链表的删除,只需知道删除节点即可完成删除。
         因此对于双向链表的插入和删除在该情况下,时间度为O(1)。
 
循环链表
循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链
循环链表的运算与单链表的运算基本一致,所不同的有以下几点:
1。在建立一个循环链表是,必须是其最后一个结点的指针指向表头结点,而不是像单链表那样置为NULL。此种情况还是用于在最后一个结点后插入一个新的结点。
2。在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已经到表尾。而非像单链表那样判断链域值是否是NULL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值