2017-03-03 118 views
0

上下文:從文件(input.txt)創建一個包含名稱列表的循環雙向鏈表。名字的數量是未知的。循環鏈接列表

提示用戶輸入要刪除的節點數量,然後相應地從列表中刪除。

假設:用戶輸入的數字不會超過列表中的實際節點數。

問題:我的刪除節點功能不起作用,因爲當我去顯示被刪除的節點中的數據時,數據仍然存在。任何幫助?

我的代碼:http://www.cplusplus.com/forum/general/210015/

(我鏈接到這個其他的網站,因爲它更容易出現格式化。)

+3

代碼應該包含在這裏。使用編輯器對其進行格式化,然後將其複製/粘貼到此處。 –

+1

並且可能不要強迫我們依賴輸入文件來提供編譯代碼。 – roalz

+2

在複製/粘貼之前,將代碼縮減爲[mcve],並驗證它是否重現了問題。 – user2079303

回答

2

我刪除節點功能無法正常工作,因爲當我去展示什麼在假定被刪除的節點中,數據仍然存在。

訪問已銷燬(已刪除)的對象具有未定義的行爲。

您不能預計當行爲未定義時程序的行爲如何。因此你的期望「數據不應該在那裏」是沒有根據的。一個正確的期望是數據可能存在或不存在,並且程序可能會或可能不會崩潰,並且守護進程可能會或可能不會從用戶的鼻子中飛出。

1

您的代碼爲void deleteNode(struct node *&head)有很多bug。

  1. 你不檢查,如果head是nullptr
  2. 你不檢查是否current->next和/或current->prev是nullptr

訪問nullptr指針是不確定的行爲,這可能意味着崩潰或意想不到的結果等

+0

'current-> next'和'current-> prev'永遠不是nullptr。 – user2079303

+0

應該是這樣的,IIF的鏈表插入被正確執行。但是,基於deleteNode(),我會安全地玩,並至少把一些assert()在這裏和那裏;-) – roalz

0

嘗試使用以下刪除功能刪除節點。 注意:假設刪除從頭開始。

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; 
     } 
    } 
+0

兩點:它是循環雙向鏈表,所以不會有空指針和刪除數節點總是少於節點總數 –

+0

您要刪除多少個節點? – roalz

+0

我遵循這個假設:用戶輸入的數字不會超過列表中的實際節點數。 –

1

問題在鏈接中解決。多謝你們!