大白话讲数据结构和算法__10 线性表的链式存储结构:双向链表

例如我们的火车刚发明的时候是只有一个“头”的,所以如果它走的线路是如下:
A->B->C->D->E->F->G->H->I->J->K->L->A
假设这会儿火车正停在K处呢,要他送一批货到J处,那么它将走的路线是:
K->L->A->B->C->D->E->F->G->H->I->J
所以后来我们的火车如果两个头,那么他便只需要向左走一站便可以到达目的站了

看完这个例子,大家就明白双向链表的必要性了吧。

双向链表的结构非常简单,就是在单链表的结构加多一个结点,称之为后继结点,用于存放上一个节点的指针

其结构如下:

typedef struct DualNode
{
ElemType data;
struct DualNode *prior;  //前驱结点
struct DualNode *next;   //后继结点
} DualNode, *DuLinkList;

这里提一下:

既然单链表可以有循环链表,那么双向链表当然也可以有。


对于双向链表中的某一个结点p,它的后继结点的前驱结点是什么?

没错,就是其本身。

双向链表的插入操作

如图所示:想要在双向链表某点P的前面插入S结点:

步骤如下:

step1:s->next = p;    
step2:s->prior = p->prior;    
step3:p->prior->next = s;    
step4:p->prior = s;

其中step1,2可以交换步骤,但是3,4不能

因为第四步先被执行了,那么p->prior就会提前变成s,使得插入的工作出错。

双向链表的删除操作

如图所示:想要在双向链表删除某点P:

步骤如下:

step1:p->prior->next = p->next;
step2:p->next->prior = p->prior;    
step3:free(p);

其中step1,2可以交换步骤

具体实现代码和案例可以参考

https://blog.csdn.net/qq_41686130/article/details/81517428

猜你喜欢

转载自blog.csdn.net/qq_41686130/article/details/81509153
今日推荐