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) 】
!注意:如何选择合适的存储结构
 链表只能顺序存取,在单链表的最后一个元素后插入元素,需遍历整个链表

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