2012-07-07 119 views
2

以下是從Adam Drozdek的C++(第二版)中的數據結構和算法的單向鏈表實現的代碼摘錄,其涉及刪除具有給定值的節點。鏈接列表實現中的錯誤

IntNode *tmp = head->next; 
head = head->next; 
delete tmp; 

在別處定義爲IntNode *)是否有在該代碼片段錯別字,或者是我在頭不正確精神處理器永遠是上述每次執行後一個空指針代碼片段?

+0

上述代碼中沒有設置爲'NULL'... – 2012-07-07 18:37:23

+0

'delete tmp!=(tmp = nullptr)' – mavam 2012-07-07 18:38:15

+0

我想確保我正確地解釋代碼。考慮一個鏈表,其中包含兩個節點--1(頭)和2.第一行代碼的_tmp_指向_head-> next_,它是節點2.第二行的_head_指向_head-> next_,它也是節點2。第三行釋放_tmp_ - 節點2指向的空間。因此,將來不會調用* head會導致程序崩潰,因爲_tmp_指向的空間被釋放了?如果不是崩潰,它肯定會導致錯誤呢? – JellalF 2012-07-07 18:55:45

回答

0

當您編寫delete tmp時,您正在刪除tmp指向的對象。但刪除後head仍然會指向同一個地方。解除引用(*head)將導致問題,因爲head指向的對象已被刪除。

+0

謝謝。這就是我的意思,但我做了這樣的假設,即刪除也將相應的指針設置爲NULL。 – JellalF 2012-07-07 19:01:50

0

不,它會指向列表中的第二個元素(現在是第一個元素)。

+0

當然,如果頭是列表中唯一的元素,那麼head-> next將最初爲NULL,然後head將爲NULL。 – MRAB 2012-07-07 18:40:50

+1

但是該元​​素現在將被刪除。 – 2012-07-07 18:47:20