最近在學習鍊錶,驚聞不能把鍊錶手寫出來就不能算是掌握了,我只好花功夫在理解+手寫上。過程中犯了許多錯誤,簡單記錄一下,順便加深一下印象,避免以後再犯同樣的錯誤。
問題一:到底是p->next = p,還是p = p->next ?
對於我來說,這個問題極易搞混。我第一面默寫時寫成了前者,結果就翻車了——輸出陷入了無限迴圈。
沒辦法,只好運用單步除錯**。找了好久才找到原因,也就是將題目中的兩種描述搞混了。
這就是問題所在了。按上圖的寫法,相當於是將當前節點的指標域賦值為當前節點的位址,示意圖如下:
檢視節點位址,發現所有節點位址都和頭節點一樣,鍊錶陷入了無窮迴圈。
將這個問題改正後,程式能正常執行。
問題二:pr和head的區別?
先看下面這段**,這是錯誤情況:
這是正確情況:
錯誤情況下發生了什麼呢?結果是head之後根本沒有插入新的節點,head還是乙個空節點。我當時的想法是,既然pr和head位址相同,那麼賦值pr與賦值head沒有什麼區別呀。可是,那針對的是賦值,而我們這裡是「賦位址」。這可與賦值不同,你將pr位址賦值後,pr與head就有了不同的位址,所以你是相當於將節點插入到pr後面了,而不是head後面。
總結:賦位址一定不能像賦值一樣等同,必須作用於head,而不是pr。
手寫反轉鍊錶
實現過程 line 9 11是將原鍊錶的第乙個節點變成了新鍊錶的最後乙個節點,同時將原鍊錶的第二個節點儲存在cur中 line13 16就是從原鍊錶的第二個節點開始遍歷到最後乙個節點,將所有節點翻轉一遍 以翻轉第二個節點為例 temp cur.next是將cur的下乙個節點儲存在temp中,也就是第...
c語言 鍊錶 C語言鍊錶例項 玩轉鍊錶
下圖為最一簡單鍊錶的示意圖 第 0 個結點稱為頭結點,它存放有第乙個結點的首位址,它沒有資料,只是乙個指標變數。以下的每個結點都分為兩個域,乙個是資料域,存放各種實際的資料,如學號 num,姓名 name,性別 和成績 score 等。另乙個域為指標域,存放下一結點的首位址。鍊錶中的每乙個結點都是同...
c語言鍊錶 鍊錶
在儲存一大波數的時候,我們通常使用陣列,但有時候陣列顯得不夠靈活,比如有一串已經從小到大排序好的數 2 3 5 8 9 10 18 26 32 現在需要往這串數中插入6使其得到的新序列仍符合從小到大排列。如果我們使用陣列來實現這一操作,則需要將8和8後面的數字都依次往後挪一位,如果你覺得這幾個數不算...