上下文:從文件(input.txt)創建一個包含名稱列表的循環雙向鏈表。名字的數量是未知的。循環鏈接列表
提示用戶輸入要刪除的節點數量,然後相應地從列表中刪除。
假設:用戶輸入的數字不會超過列表中的實際節點數。
問題:我的刪除節點功能不起作用,因爲當我去顯示被刪除的節點中的數據時,數據仍然存在。任何幫助?
我的代碼:http://www.cplusplus.com/forum/general/210015/
(我鏈接到這個其他的網站,因爲它更容易出現格式化。)
上下文:從文件(input.txt)創建一個包含名稱列表的循環雙向鏈表。名字的數量是未知的。循環鏈接列表
提示用戶輸入要刪除的節點數量,然後相應地從列表中刪除。
假設:用戶輸入的數字不會超過列表中的實際節點數。
問題:我的刪除節點功能不起作用,因爲當我去顯示被刪除的節點中的數據時,數據仍然存在。任何幫助?
我的代碼:http://www.cplusplus.com/forum/general/210015/
(我鏈接到這個其他的網站,因爲它更容易出現格式化。)
我刪除節點功能無法正常工作,因爲當我去展示什麼在假定被刪除的節點中,數據仍然存在。
訪問已銷燬(已刪除)的對象具有未定義的行爲。
您不能預計當行爲未定義時程序的行爲如何。因此你的期望即「數據不應該在那裏」是沒有根據的。一個正確的期望是數據可能存在或不存在,並且程序可能會或可能不會崩潰,並且守護進程可能會或可能不會從用戶的鼻子中飛出。
您的代碼爲void deleteNode(struct node *&head)
有很多bug。
head
是nullptrcurrent->next
和/或current->prev
是nullptr訪問nullptr指針是不確定的行爲,這可能意味着崩潰或意想不到的結果等
'current-> next'和'current-> prev'永遠不是nullptr。 – user2079303
應該是這樣的,IIF的鏈表插入被正確執行。但是,基於deleteNode(),我會安全地玩,並至少把一些assert()在這裏和那裏;-) – roalz
嘗試使用以下刪除功能刪除節點。 注意:假設刪除從頭開始。
void deleteNode(struct node *&head,int deleteCount)
{
if(head != NULL){
struct node *current=head; //copy of head.
struct node *temp,*headPrev,*headNext;
headPrev = head->prev;
headNext = head->next;
int count = 0;
while(count++ < deleteCount)
{
//add code to free current node from me
temp = current; //get rid of this node
currrent = current->next; //skip all the nodes you want delete
}
current->prev = headPrev;
headPrev->next = current;
head = current;
}
}
問題在鏈接中解決。多謝你們!
代碼應該包含在這裏。使用編輯器對其進行格式化,然後將其複製/粘貼到此處。 –
並且可能不要強迫我們依賴輸入文件來提供編譯代碼。 – roalz
在複製/粘貼之前,將代碼縮減爲[mcve],並驗證它是否重現了問題。 – user2079303