2.3.3单链表的双向链表

2.3.3双向链表 插入、删除

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

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

双链表通常采用带头结点的循环链表形式
2.3.3单链表的双向链表

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

【结点指向】
2.3.3单链表的双向链表

【插入操作】:

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

2.3.3单链表的双向链表
【操作算法
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释放内存

2.3.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) 】

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

2.3.3单链表的双向链表

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