双向链表插入、删除操作
来源:互联网 发布:高洛峰php免费视频 编辑:程序博客网 时间:2024/06/13 03:25
来源:http://blog.csdn.net/csdanca11/article/details/7173856
双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指向其前驱的指针域prior。这样形成的链表中就有两条方向不同的链,我们可称之为双(向)链表(DoubleLinked List)。双链表的结构定义如下:
typedef structDNode
{
ElemType data;
struct DNode*prior,*next;
}DNode,*DoubleList;
双链表的结点结构如图2.14所示。
与单链表类似,双链表一般也是有头指针唯一确定的,增加头结点也能使双链表的某些运算变得方便。同时双向链表也可以有循环表,称为双向循环链表,其结构如图2.15所示。
由于在双向链表中既有前向链又有后向链,寻找任一个结点的直接前驱结点与直接后继结点变得非常方便。设指针p指向双链表中某一结点,则有下式成立:
P->prior->next=p=p->next->prior
在双向链表中,那些只涉及后继指针的算法,如求表长度、取元素、元素定位等,与单链表中相应的算法相同,但对于前插和删除操作则涉及到前驱和后继两个方向的指针变化,因此与单链表中的算法不同。
1.双向链表的前插操作
算法描述:欲在双向链表第i个结点之前插入一个新的结点,则指针的变化情况如图2.16所示。
intDlinkIns(DoubleList L,int i,ElemType e)
{
DNode *s,*p;
…
…
s=(DNode*)malloc(sizeof(DNode));
if(s)
{
s->data=e;
s->prior=p->prior;p->prior->next=s;
s->next=p;p->prior=s;
return TRUE;
}
else
teturn fALSE;
}
算法双向链表的插入操作
2.双向链表的删除操作
算法描述:欲删除双向链表中的第i个结点,则指针的变化情况如图2.17所示。
intDlinkDel(DoubleList L,int i,ElemType *e)
{
DNode *p;
…
…
*e=p->prior->next=p->next;
p->next->prior->p=p->prior;
free(p);
return TRUE;
}
- 双向链表插入、删除操作
- 双向链表插入、删除操作
- 双向链表插入、删除操作
- 双向链表基本操作:删除、插入、双向输出
- 双向循环链表的创建,插入,删除操作
- 双向循环链表的创建修改插入删除操作
- C语言---双向链表的插入、删除、查找操作
- C语言---双向链表的插入、删除、查找操作
- 双向链表的操作(插入和删除)
- 如何实现双向链表的插入、删除操作
- 双向链表插入删除
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 双向链表实现 插入删除
- 双向链表建立、插入和删除
- 双向循环链表的插入删除
- 双向链表的建立插入删除
- 关于双向链表之插入+删除
- 双向链表插入与删除
- 设计模式【MVC模式】
- 程序人生
- 惹恼程序员的十件事
- 【深度学习】使用tensorflow实现VGG19网络
- lxml, python的lxml工具箱
- 双向链表插入、删除操作
- MySQL使用RPM安装时,各目录在哪儿?
- Super Query 一个多源查询数据对比的工具
- 妹控
- vs2017 编译最新的谷歌v8 6.4.0 版本 引擎
- CsvHelper, 帮助读取和写入CSV文件的库
- 现代软件工程_团队项目_阿尔法阶段_市场调研问卷_2017.11.11
- xmlview, 用于 Google Chrome 和Safari的强大的XML查看器
- Codeforces 888C:K-Dominant Character