在双向链表的结点中有两个指针域,其一指向直接后继,另一个指向直接前趋
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
<----
q
p->prior
---------------------------------------
现在假设需要插入结点s,则需要进行以下4次操作:
(1)(2)完成q 与s的握手
(1)q->next = s;
(2)s->prior=q;
q->next
--->
q
<---
s->prior
--------------------------------------
(3)(4)完成s 与q 的握手
(3)s->next = p;
(4)p->prior = s;
q->next s->next
-->
q
<-- <--
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;
由于不知道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
q
<-- <--
s->prior p->prior
q->next
-->
q
<--
p->prior
对于本例,是上面原型的变种,只已知s ,但由双向链表的性质,我们可以推出以下关系:
q == s->prior;
p == s->next;
因此可做以下替换:
(1)s->prior->next = s->next;
(2)s->next->prior = s->prior;