雙鏈表(Double Linked LIst

2021-10-02 20:08:42 字數 3464 閱讀 7054

雙鏈表屬於鍊錶的一種,有兩個指標域,分別指向直接後繼和直接前驅。所有在遍歷雙向鍊錶時,從任意乙個節點開始,都可以很方便的訪問它的前驅節點和後繼節點。使用這種方式解決了單鏈表中不能使用反向遍歷的問題。

在雙鏈表中,每個節點包含三個部分:

struct node

*head=

null

;

基本的運算形式:增加、刪除、更新

插入節點到序列尾部

建立乙個新的節點,通過遍序列表到序列末尾,讓後將節點插入到末尾。

插入過程

建立乙個新節點並賦值,將node的next指標設定為null

檢查集合的頭節點是否為空(head==null)

如果頭節點為空,設定newnode->previous=null,head=newnode;

如果頭節點不為空,定義乙個臨時節點temp=head;

移動temp節點直到到達序列的尾部

設定newnode=temp->next和temp=newnode->previous;

void

insertatend

(int value)

else

printf

("插入末尾成功");

}

插入節點到頭部

建立乙個新的節點,將頭節點替換為新的節點,並更新指標的指向。

插入過程

建立乙個新的節點newnode,並設定newnode->previous=null;

檢查是否head==null;

如果head==null,newnode->next=null,head=newnode;

如果head!=null,newnode->next=head,head=newnode;

void

insertatbeginning

(int value)

else

printf

("插入成功");

}

插入節點到指定元素後

迴圈遍歷鍊錶,建立乙個新的節點,然後將其插入到鍊錶中的指定位置

插入過程

建立乙個新節點並賦值

檢查鍊錶是否為空(head==null)

如果(head==null),newnode->previous=null,newnode->next=null,head=newnode

定義乙個temp=head

通過迴圈遍歷移動temp節點,指定找到我們需要插入的節點位置(for迴圈到position-1)

如果temp->next==null設定flag=0,表面我們要查詢的目標元素未發現,終止迴圈

如果flag=1,設定newnode->next=temp->next,temp->next->previous=newnode,temp->next=newnode和newnode->previous=temp;

void

insertafter

(int value,

int pos)

else}if

(flag)

else

printf

("number of elements is less than position entered");

}}

從鍊錶尾部刪除節點

通過迴圈遍歷到鍊錶尾部,刪除尾部節點

從尾部刪除過程

檢查鍊錶是否為空(head==null)

如果為空,丟擲錯誤並終止程式

如果不為空,定義乙個temp=head;

檢查是否鍊錶只存在乙個節點(temp->previous=null和temp->next=null)

如果只存在乙個節點,設定head=null並刪除temp節點

如果鍊錶存在多個節點,移動temp節點直到到達鍊錶尾部(temp->next!=null)

設定temp->previous->next=null並釋放temp占用記憶體(free(temp))

void

deleteend()

else

printf

("\n刪除成功");

}}

從鍊錶頭部刪除節點

從鍊錶頭部刪除節點

從頭部刪除過程

檢查鍊錶是否為空(head==null)

如果為空,丟擲異常並終止

如果不為空,定義乙個temp節點,且temp=head

檢查鍊錶是否只有乙個節點(temp->previous=temp->next)

如果鍊錶只有乙個節點,設定head=null並釋放free(temp)

否則,設定temp->next=head,head->previous=null並釋放free(temp)

void

deletebeginning()

else

printf

("\n刪除成功");

}}

從鍊錶指定位置刪除節點

遍歷鍊錶到找到指定節點

從指定位置刪除過程

檢查鍊錶是否為空(head==null)

如果為空,丟擲錯誤並終止

如果不為空,定義乙個temp,且temp=head

移動temp節點,直到找到目標節點或者到達鍊錶末尾

如果到達節點末尾,丟擲未發現目標節點異常,並終止

如果到達目標節點,檢查是否只有乙個節點

如果僅有乙個節點,設定head=null並釋放free(temp)

如果鍊錶有多個節點,檢查是否為頭節點(temp==head)

如果為頭節點(temp=head),將頭節點移動到下乙個節點(head==head->next),設定head->previous=null並釋放記憶體free(temp)

如果temp!=head,檢查temp是否為最後乙個節點(temp->next==null)

如果為最後乙個節點,設定temp->previous->next=null並釋放free(temp)

如果temp不是第乙個節點也不是最後乙個節點,設定temp->previous-next=temp->next,temp->next->previous=temp->previous並釋放free(temp)

void

deletespecific

(int delvalue)

else}if

(temp == head)

else

printf

("\ndeletion successful");

}}

瀏覽器的歷史紀錄 大多數主流瀏覽器都支援針對瀏覽歷史記錄的前進、後退,就是基於雙鏈表設計的

大多數演算法

遊戲:卡牌遊戲,記錄牌的順序

單鏈表 雙鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...

單鏈表和雙鏈表

單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...

單鏈表和雙鏈表

單鏈表 是乙個node,儲存當前物件,並指向下乙個next,插入在第一位node,next指向原來的first 單鏈表 只儲存第乙個node的引用,雙端鍊錶 儲存兩個node的引用,第乙個和最後乙個node,可以從第乙個插入,也可以從最後乙個插入,也可以從頭部和尾部刪除 鏈結點,相當於是車廂 pub...