雙向鏈表(C語言)詳解
目前我們所學到的鏈表,無論是動態(tài)鏈表還是靜態(tài)鏈表,表中各個節(jié)點都只包含一個指針(游標),且都統(tǒng)一指向直接后繼節(jié)點,這類鏈表又統(tǒng)稱為單向鏈表或單鏈表。
雖然單鏈表能 100% 存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但在解決某些實際問題時,單鏈表的執(zhí)行效率并不高。例如,若實際問題中需要頻繁地查找某個結(jié)點的前驅(qū)結(jié)點,使用單鏈表存儲數(shù)據(jù)顯然沒有優(yōu)勢,因為單鏈表的強項是從前往后查找目標元素,不擅長從后往前查找元素。
解決此類問題,可以建立雙向鏈表(簡稱雙鏈表)。
雙向鏈表是什么
從名字上理解雙向鏈表,即鏈表是 "雙向" 的,如圖?1 所示:

“雙向”指的是各節(jié)點之間的邏輯關(guān)系是雙向的,頭指針通常只設(shè)置一個。
從圖 1 中可以看到,雙向鏈表中各節(jié)點包含以下 3 部分信息(如圖 2 所示):
指針域:用于指向當前節(jié)點的直接前驅(qū)節(jié)點;
數(shù)據(jù)域:用于存儲數(shù)據(jù)元素。
指針域:用于指向當前節(jié)點的直接后繼節(jié)點;

因此,雙鏈表的節(jié)點結(jié)構(gòu)用 C 語言實現(xiàn)為:
雙向鏈表的創(chuàng)建
同單鏈表相比,雙鏈表僅是各節(jié)點多了一個用于指向直接前驅(qū)的指針域。因此,我們可以在單鏈表的基礎(chǔ)輕松實現(xiàn)對雙鏈表的創(chuàng)建。
需要注意的是,與單鏈表不同,雙鏈表創(chuàng)建過程中,每創(chuàng)建一個新節(jié)點都要與其前驅(qū)節(jié)點建立兩次聯(lián)系,分別是:
將新節(jié)點的 prior 指針指向直接前驅(qū)節(jié)點;
將直接前驅(qū)節(jié)點的 next 指針指向新節(jié)點;
這里給出創(chuàng)建雙向鏈表的 C 語言實現(xiàn)代碼:
我們可以嘗試著在 main 函數(shù)中輸出創(chuàng)建的雙鏈表,C 語言代碼如下:
程序運行結(jié)果:
1 <-> 2 <-> 3 <-> 4 <-> 5
鏈表中第 4 個節(jié)點的直接前驅(qū)是:3