雙向鍊錶(詳解)

2021-10-24 22:26:00 字數 2906 閱讀 3710

雙向鍊錶操作

在學習了單鏈表之後,就順帶學習了雙鏈表的操作。

什麼是雙鏈表?

雙鏈表顧名思義,就是鍊錶由單向的鏈變成了雙向鏈。 使用這種資料結構,我們可以不再拘束於單鏈表的單向建立於遍歷等操作,大大減少了在使用中存在的問題。

在單鏈表中,我們有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域則負責鍊錶之間的「聯絡」。 而在雙向鍊錶中,我們需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。

/* 單鏈表的結構 */

struct list

;/* 雙向鍊錶的結構 */

typedef

struct list

;typedef

struct list* pelem;

typedef

struct list eelem;

同單鏈表一樣,對雙向鍊錶的操作也有建立,插入,遍歷,刪除,銷毀。

雙向鍊錶的建立

在建立雙向鍊錶的時候,我們需要初始化的有兩個指標。同單鏈表一樣,我們需要乙個頭指標來標誌鍊錶的資訊。因此我們可以寫出該函式的定義:

pelem creatlist()

雙向鍊錶的插入

在單向鍊錶的頭插法中,最主要的語句自然就是tmp->next = head->next, 而在雙向鍊錶中,自然也是一樣,只不過多了連線乙個向前的指標而已。

void

insertelem

( pelem head ,

int data )

pelem tmphead = head;

// 建立乙個臨時的頭結點指標

if( tmphead->next ==

null

)else

}

許多人肯定是被最後四條語句弄得一臉懵逼,都一樣。但是當你畫出影象時,你就會懂得一切。

我們建立乙個新的結點addition, 此時鍊錶中只有頭結點,因此執行if中的程式,執行完畢之後就變成了:

而當鍊表中不只有乙個頭結點時,這時有點意思了。此時,head的next指標指向addition、front指標指向null,addition的next指向null、front 指標指向head。

此時,我們要在鍊錶中再插入乙個新的結點。 此時,不只要對next 鏈進行斷鏈,增鏈,還要對front 鏈進行同樣操作。這樣才能完成兩條鏈的連線。

雙向鍊錶的遍歷

不同於單鏈表的單向遍歷,雙向鍊錶提供了操作的便捷性,可前可後的遍歷方式簡直聊咋咧… 因此在遍歷中將實現next 的向後遍歷,也會實現front的向前遍歷。

void

illulist

( pelem head )

pelem tmphead = head;

while

( tmphead->next !=

null

)// 此時tmphead 的位址在鍊錶的最後乙個結點處

while

( tmphead->front->front !=

null

)printf

("%d\n"

,tmphead->data)

;return

;}

當向後遍歷完成之後,此時tmphead的位址是鍊錶的最後乙個結點的位址,因此使用front 來進行向前的遍歷。 如果判斷條件是tmphead->front != null 的話,會將頭結點的資料域也輸出,然頭結點的資料域未使用,因此會輸出乙個不確定的值。 正因如此將判斷條件定為tmphead->front->front != null

刪除乙個結點

當刪除乙個結點的時候,我們要判斷在鍊錶中是否存在與之匹配的結點,有的話刪除成功,否則失敗。

就像這幅圖一樣,當刪除addition結點時,先講addition的下乙個結點與head相連,而下乙個結點是null , 因此可以得出函式為:

void

deleteelem

( pelem head ,

int data )

pelem tmphead = head;

while

( tmphead->next !=

null)}

free

(tmphead)

;// 釋放記憶體

}

銷毀鍊錶

銷毀乙個雙向鍊錶的操作同單鏈表的相似。指標不斷向後運動,每運動乙個結點,釋放上乙個結點。

void

destroylist

( pelem head )

free

(head)

;}

這裡相對容易理解。

此時,tmp的位址就是head的位址,但當執行乙個之後,就變成了這樣。

上一次執行完之後,頭結點已經被釋放 ,此時頭結點就在第乙個資料結點處。 以此往後,最後迴圈結束,釋放最後乙個結點。

STL list 雙向鍊錶 詳解

閒話 當你了解了stl中的一兩個容器之後,再去學習它另外的容器,就會發現它們的重合點非常多。如果你不想看這麼多字,那麼前兩段就可以略過了。list 容器視線裡雙向鍊錶的資料結構,資料元素通過鍊錶指標連城邏輯意義上的線性表,這樣,對鍊錶的任一位置的元素進行插入 刪除和查詢都會是極快的。下圖是list ...

mysql 雙向鍊錶 雙向鍊錶

雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...

雙向鍊錶(鍊錶)

雙向鍊錶 每個節點包含指向後繼節點的指標和指向前驅節點的指標。繼承關係圖 實體圖 duallinklist.h duallinklist 雙向鍊錶類模板 成員變數 node 節點實體 m header 頭節點 m length 鍊錶長度 m step 步進長度 m current 當前節點前乙個節點...