雙鍊表

雙鍊表中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點地址外,還增加一個指向其直接前趨的指針域prior。

1、雙向鍊表(Doubly Linked List)
雙(向)鍊表中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點地址外,還增加一個指向其直接前趨的指針域prior。
注意:
①雙鍊表由頭指針head惟一確定的。
②帶頭結點的雙鍊表的某些運算變得方便。
③將頭結點和尾結點連結起來,為雙(向)循環鍊表。
2、雙向鍊表的結點結構和形式描述
①結點結構(見上圖a)
②形式描述
typedef struct dlistnode{
DataType data;
struct dlistnode *prior,*next;
}DListNode;
typedef DListNode *DLinkList;
DLinkList head;
3、雙向鍊表的前插和刪除本結點操作
刻畫雙鍊表結構的對稱性的語句:p→prior→next== p→next→prior;由於雙鍊表的對稱性,在雙鍊表能能方便地完成各種插入、刪除操作。
①雙鍊表的前插操作
void DInsertBefore(DListNode *p,DataType x)
{//在帶頭結點的雙鍊表中,將值為x的新結點插入*p之前,設p≠NULL
DListNode *s=malloc(sizeof(DListNode));//①
s->data=x;//②
s->prior=p->prior;//③
s->next=p;//④
p->prior->next=s;//⑤
p->prior=s;//⑥
}
②雙鍊表上刪除結點*p自身的操作
void DDeleteNode(DListNode *p)
{//在帶頭結點的雙鍊表中,刪除結點*p,設*p為非終端結點
p->prior->next=p->next;//①
p->next->prior=p->prior;//②
free(p);//③
}
注意:
與單鍊表上的插入和刪除操作不同的是,在雙鍊表中插入和刪除必須同時修改兩個方向上的指針。
上述兩個算法的時間複雜度均為O(1)。

相關搜尋

熱門詞條

聯絡我們