2.3.3单链表的双向链表

2.3.3双向链表 插入、删除

指在前驱和后驱方向都能游历(遍历)的线性链表

双向链表的每个结点有两个指针域
【结构】:prior data next

双链表通常采用带头结点的循环链表形式
在这里插入图片描述

可理解为首位相接的数据“圈”,每个结点都可以向前或向后走

【结点指向】
在这里插入图片描述

【插入操作】:

1.分配空间
2.断开与连接

在这里插入图片描述
【操作算法
status ListInsert_DuL(DuLinkList &L,int i,ElemType e)
{if(!p=GetElem_Dul(L,i))
return ERROR; 相当于嵌套第i个结点的指针

if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
return ERROR 空间分配失败
s-data=e; 将数据放入新结点的数据图
s-prior=p-prior; 将p的前驱结点指针放入新结点的前向指针域
s-next=p; 将p放入新结点的反向指针域
p-prior-next=s; 修改p的前驱结点的反向指针
p-prior=s; 修改p的前驱指针
return OK;
} ListInsert_DuL

【删除操作】

1.p指向目标结点
2.将目标结点的前一个结点与后一个连接(跳过中间那个)
3释放内存

在这里插入图片描述
【操作算法】
status ListDelete_Dul(DuLinkList &L,int i,ElemType &e)
{ 删除头结点的双向循环链表L中第i个元素返回,1=i=表长
if(!p=GetElem_Dul(L,i))
return ERROR; 查找第i个指针
e=p-data; 将p指向结点数据域中的值取出
p-prior-next=p-next; p前一个结点的后驱指向p的后一个结点
p-next-prior=p-prior; 后指向前
free§; 释放p
return OK;

} ListDelete_DuL

【 算法评价:T(n)=O(n) 】

!注意:如何选择合适的存储结构
链表只能顺序存取,在单链表的最后一个元素后插入元素,需遍历整个链表

在这里插入图片描述

频繁插入删除用链式存储
偶尔 用顺序存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b1gpig安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值