2017-03-19 49 views
-2

我開發了一個功能,以從鏈表中刪除所有節點。除最後一個節點外,所有節點都成功刪除。請幫助我爲什麼最後一個節點沒有被刪除?以下是我的代碼:C++鏈接列表刪除所有方法正在離開最後一個元素去除

void StudentLinkList::removeAll() { 
    StudentData *traversePointer = this->head; 

    while (this->head->getNext() != nullptr) { 
     this->head = this->head->getNext(); 
     delete traversePointer; 
     traversePointer = this->head; 
    } 

    delete this->head; 
} 
+1

你可能需要測試,如果這個 - >頭爲空或不是。 –

+0

可能被拒絕了,因爲你沒有顯示任何你試圖自己解決這個問題。 – stark

+0

如果您還沒有「刪除」功能,請進行「刪除」功能。繼續調用'remove'函數,直到'is_empty'函數(你有這些,對嗎?)返回true。 – user4581301

回答

0

你刪除這個 - >頭,但你應該設置這個 - >頭nullptr爲好。當你釋放節點正在使用的內存時,存儲在節點舊位置的數據通常不會立即被覆蓋,這就是爲什麼它看起來最後一個節點沒有被刪除。

編輯:downvote是正式注意到,有人可以澄清我錯了什麼?

此外,我同意上面的評論 - 你也應該檢查this-> head在循環之前是否爲null。

+0

輝煌。將其設置爲nullptr工​​作。你能否提供任何文件說明存儲在節點舊位置的數據通常不會立即被覆蓋?這是在c + +或錯誤的規則? –

+0

從技術上說,它不會出現在文檔中,它不是應該發生的事情。但是爲了提高效率,內存分配器在釋放內存時通常不會覆蓋數據,因爲分配器不需要重置已釋放的數據。這就是爲什麼你需要對C中創建的數組進行初始化。我將避免在釋放數據後使用任何數據,因爲編譯器可以選擇將釋放的內存塊顯式重置爲全0。但是,即使內存被覆蓋,this-> head仍然是指向未分配內存區域的指針。 –

+0

基本上,分配給程序的內存通常會在下次分配內存塊時釋放後釋放。 –

1

如此接近

void StudentLinkList::removeAll() { 
    StudentData *traversePointer; 

    // Continue while there are any elements on the list 
    // Extra parens to indicate that we want the result of the 
    // assignment as boolean. No need to compare to nullptr. 
    while ((traversePointer = this->head)) { 
     // First preserve the rest of the list 
     this->head = this->head->getNext(); 
     // only then can we delete this node 
     delete traversePointer; 
    } 
    // list is now empty 
} 
+0

這是一個不錯的方法。只是想知道我正在刪除我的代碼中的所有節點。儘管如此,它沒有工作。 –

+1

您正在測試下一個元素而不是當前元素。想想所有的特例:空列表,1元素列表等。 – stark

+0

是的,你是對的。它會在空列表的情況下崩潰。 –

相關問題