线性表的应用
双向链表
在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表
双向链表结点结构:
双向链表的结构可定义如下:
typedef struct DuLNode{
ElemType data;
struct DuLnode *prior , *next;
}DuLNode,*DuLinkList;
图示:
双向链表结构的对称性(设指针p指向某一结点):
p -> prior -> next = p = p -> next -> prior
在双向链表中有些操作,因仅涉及一个方向的指针,故它们的算法与线性链表的相同。但在插入、删除时,则需同时修改两个方向上的指针,两者的操作的时间复杂度均为O(n)。
双向链表的插入
void ListInsert_DuL(DuLinkList &L,int i,ElemType e){
if(!(p=GetElemP_DuL(L,i)))
//在L中确定第i个元素的位置指针 p
return ERROR;
//p为NULL时,第i个元素不存在
s = new DuLNode;
//生成新结点*s
s->data = e;
//将结点*s数据域置为e
s -> prior = p->prior;
//将结点*s插入L中,对应图中步骤 ①
p -> prior -> next = s;
//对应图中步骤 ②
s -> next = p;
//对应图中步骤 ③
p -> prior = s;
//对应图中步骤 ④
return OK;
} //ListInsert_DuL
双向链表的删除
void ListDelte_DuL(DuLink &L