双向链表
介绍
因为在循环链表中某一结点要访问其前驱结点的时候,需要循环扫描整个链表一遍,效率太低了。为了方便访问结点的前驱结点,我们引入了双向链表的概念。原本一个结点的结构包括data(数据)域和next(指针)域;双向链表拥有两个指针域和一个数据域,两个指针分别指向前驱结点和后继结点。
定义方法
定义方法如下:
- 方法一:
struct Dnode{ //Dnode是指双向链表结点
ElemType data; //data为抽象元素类型
struct Dnode *prior,*next //定义prior(前驱),next(后继)指针类型
};
- 方法二:
typedef struct Dnode{
Elemtype data;
struct Dnode *prior,*next; //prior,next为指针类型
}*DLList
双向循环链表
空表
L->next==L->prior==L
在使用双向链表指针的时候要注意一个结点是有前驱和后继两个指针的!
非空表
设(除表头结点)第一个结点(首结点)数据域值为A1,p指向A1,以此类推,直到最后一个结点(第n个结点/尾结点)的数据域值为An,我们可以得出的结论:
1.p==p->next->prior
2.p==p->prior->next
删除结点
设需要删除的结点B在A结点(前驱)和C结点(后继)之间,p指向B结点:
p->prior->next==p->next; //结点A的next(后继)指向结点C
p->next->prior==p->prior; //结点C的prior(前驱)指向结点A
free(p); //释放结点B占有的空间
插入结点
设需要插入的结点B将在A结点(前驱)和C结点(后继)之间,p指向C结点,f指向B结点:
f->prior=p->prior; //结点B的prior)(前驱)指向结点A
f->next=p; //结点B的next(后继)指向结点C
p->prior->next=f; //结点A的next(后继)指向结点B
p->prior=f; //结点C的prior指向结点B
标签:结点,指向,next,链表,prior,前驱,双向
From: https://www.cnblogs.com/qinyu33/p/16937071.html