?? 例11.10.txt
字號:
例11.10寫一函數(shù)以刪除動態(tài)鏈表中指定的結(jié)點(diǎn)。
以指定的學(xué)號作為刪除結(jié)點(diǎn)的標(biāo)志。例如,輸入99103表示要求刪除學(xué)號為99103的結(jié)點(diǎn)。解題的思路是這樣的:從p指向的第一個結(jié)點(diǎn)開始,檢查該結(jié)點(diǎn)中的num值是否等于輸入的要求刪除的那個學(xué)號。如果相等就將該結(jié)點(diǎn)刪除,如不相等,就將p后移一個結(jié)點(diǎn),再如此進(jìn)行下去,直到遇到表尾為止。
可以設(shè)兩個指針變量p1和p2,先使p1指向第一個結(jié)點(diǎn)(圖11.20(a))。如果要刪除的不是第一個結(jié)點(diǎn),則使p1后指向下一個結(jié)點(diǎn)(將p1->next賦給p1),在此之前應(yīng)將p1的值賦給p2,使p2指向剛才檢查過的那個結(jié)點(diǎn),見圖11.20(b)。如此一次一次地使p后移,直到找到所要刪除的結(jié)點(diǎn)或檢查完全部鏈表都找不到要刪除的結(jié)點(diǎn)為止。如果找到某一結(jié)點(diǎn)是要刪除的結(jié)點(diǎn),還要區(qū)分兩種情況:①要刪的是第一個結(jié)點(diǎn)(p1的值等于head的值,如圖11.20(a)那樣),則應(yīng)將p1->next賦給head。見圖11.20(c)。這時head指向原來的第二個結(jié)點(diǎn)。第一個結(jié)點(diǎn)雖然仍存在,但它已與鏈表脫離,因?yàn)殒湵碇袥]有一個結(jié)點(diǎn)或頭指針指向它。雖然p1還指向它,它仍指向第二個結(jié)點(diǎn),但仍無濟(jì)于事,現(xiàn)在鏈表的第一個結(jié)點(diǎn)是原來的第二個結(jié)點(diǎn),原來第一個結(jié)點(diǎn)已“丟失” ,即不再是鏈表中的一部分了。② 如果要刪除的不是第一個結(jié)點(diǎn),則將p1->next賦給p2->next,見圖11.20(d)。p2->next原來指向p1指向的結(jié)點(diǎn)(圖中第二個結(jié)點(diǎn)),現(xiàn)在p2->next改為指向p1->next所指向的結(jié)點(diǎn)(圖中第三個結(jié)點(diǎn))。p1所指向的結(jié)點(diǎn)不再是鏈表的一部分。還需要考慮鏈表是空表(無結(jié)點(diǎn))和鏈表中找不到要刪除的結(jié)點(diǎn)的情況。圖11.21表示解此題的算法。
刪除結(jié)點(diǎn)的函數(shù)del如下:
struct student
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -