雙向鏈表基本操作(C語言)詳解
前面學(xué)習(xí)了如何創(chuàng)建一個(gè)雙向鏈表,本節(jié)學(xué)習(xí)有關(guān)雙向鏈表的一些基本操作,即如何在雙向鏈表中添加、刪除、查找或更改數(shù)據(jù)元素。
本節(jié)知識基于已熟練掌握雙向鏈表創(chuàng)建過程的基礎(chǔ)上,我們繼續(xù)上節(jié)所創(chuàng)建的雙向鏈表來學(xué)習(xí)本節(jié)內(nèi)容,創(chuàng)建好的雙向鏈表如圖?1 所示:

雙向鏈表添加節(jié)點(diǎn)
根據(jù)數(shù)據(jù)添加到雙向鏈表中的位置不同,可細(xì)分為以下 3 種情況:
1) 添加至表頭
將新數(shù)據(jù)元素添加到表頭,只需要將該元素與表頭元素建立雙層邏輯關(guān)系即可。
換句話說,假設(shè)新元素節(jié)點(diǎn)為 temp,表頭節(jié)點(diǎn)為 head,則需要做以下 2 步操作即可:
temp->next=head; head->prior=temp;
將 head 移至 temp,重新指向新的表頭;
例如,將新元素 7 添加至雙鏈表的表頭,則實(shí)現(xiàn)過程如圖 2 所示:

2) 添加至表的中間位置
同單鏈表添加數(shù)據(jù)類似,雙向鏈表中間位置添加數(shù)據(jù)需要經(jīng)過以下 2 個(gè)步驟,如圖 3 所示:
新節(jié)點(diǎn)先與其直接后繼節(jié)點(diǎn)建立雙層邏輯關(guān)系;
新節(jié)點(diǎn)的直接前驅(qū)節(jié)點(diǎn)與之建立雙層邏輯關(guān)系;

3) 添加至表尾
與添加到表頭是一個(gè)道理,實(shí)現(xiàn)過程如下(如圖 4 所示):
找到雙鏈表中最后一個(gè)節(jié)點(diǎn);
讓新節(jié)點(diǎn)與最后一個(gè)節(jié)點(diǎn)進(jìn)行雙層邏輯關(guān)系;

因此,我們可以試著編寫雙向鏈表添加數(shù)據(jù)的 C 語言代碼,參考代碼如下:
雙向鏈表刪除節(jié)點(diǎn)
和添加結(jié)點(diǎn)的思想類似,在雙向鏈表中刪除目標(biāo)結(jié)點(diǎn)也分為 3 種情況。
1) 刪除表頭結(jié)點(diǎn)
刪除表頭結(jié)點(diǎn)的過程如下圖所示:

刪除表頭結(jié)點(diǎn)的實(shí)現(xiàn)過程是:
新建一個(gè)指針指向表頭結(jié)點(diǎn);
斷開表頭結(jié)點(diǎn)和其直接后續(xù)結(jié)點(diǎn)之間的關(guān)聯(lián),更改 head 頭指針的指向,同時(shí)將其直接后續(xù)結(jié)點(diǎn)的 prior 指針指向 NULL;
釋放表頭結(jié)點(diǎn)占用的內(nèi)存空間。
2) 刪除表中結(jié)點(diǎn)
刪除表中結(jié)點(diǎn)的過程如下圖所示:

刪除表中結(jié)點(diǎn)的實(shí)現(xiàn)過程是:
找到目標(biāo)結(jié)點(diǎn),新建一個(gè)指針指向改結(jié)點(diǎn);
將目標(biāo)結(jié)點(diǎn)從鏈表上摘除;
釋放該結(jié)點(diǎn)占用的內(nèi)存空間。
3) 刪除表尾結(jié)點(diǎn)
刪除表尾結(jié)點(diǎn)的過程如下圖所示:

刪除表尾結(jié)點(diǎn)的實(shí)現(xiàn)過程是:
找到表尾結(jié)點(diǎn),新建一個(gè)指針指向該結(jié)點(diǎn);
斷點(diǎn)表尾結(jié)點(diǎn)和其直接前驅(qū)結(jié)點(diǎn)的關(guān)聯(lián),并將其直接前驅(qū)結(jié)點(diǎn)的 next 指針指向 NULL;
釋放表尾結(jié)點(diǎn)占用的內(nèi)存空間。
雙向鏈表刪除節(jié)點(diǎn)的 C 語言實(shí)現(xiàn)代碼如下:
雙向鏈表查找節(jié)點(diǎn)
通常情況下,雙向鏈表和單鏈表一樣都僅有一個(gè)頭指針。因此,雙鏈表查找指定元素的實(shí)現(xiàn)同單鏈表類似,也是從表頭依次遍歷表中元素。
C 語言實(shí)現(xiàn)代碼為:
雙向鏈表更改節(jié)點(diǎn)
更改雙鏈表中指定結(jié)點(diǎn)數(shù)據(jù)域的操作是在查找的基礎(chǔ)上完成的。實(shí)現(xiàn)過程是:通過遍歷找到存儲(chǔ)有該數(shù)據(jù)元素的結(jié)點(diǎn),直接更改其數(shù)據(jù)域即可。
實(shí)現(xiàn)此操作的 C 語言實(shí)現(xiàn)代碼如下:
總結(jié)
這里給出雙鏈表中對數(shù)據(jù)進(jìn)行 "增刪查改" 操作的完整實(shí)現(xiàn)代碼:
程序執(zhí)行結(jié)果為:
創(chuàng)建好的雙向鏈表為:
1 <-> 2 <-> 3 <-> 4 <-> 5
刪除元素 2:
1 <-> 3 <-> 4 <-> 5
元素 3 的位置是:2
表中的元素 3 改為 6:
1 <-> 6 <-> 4 <-> 5