2017-08-05 86 views
1

我的教科書具有以下代碼,用於從鏈接列表中刪除元素。刪除鏈接列表中的值/刪除未動態分配的值

void remove(double num) 
{ 
    Node *cur, *prev; 
    if(!head){ 
     return; 
    } 
    if(head->data == num) 
    { 
     cur = head; 
     head = head->next; 
     delete cur; 
    } 
    else{ 
     cur = head; 
     while(cur!=NULL && cur->data != num) 
     { 
      prev = cur; 
      cur= cur->next; 
     } 
     if(cur) 
     { 
      prev->next = cur->next; 
      delete cur; 
     } 
    } 
} 

我對這段代碼有幾個疑問。首先,如何刪除未動態分配的值?爲什麼這是必要的?我在任何地方都看不到新的聲明。其次,爲什麼這個代碼塊是必需的?爲什麼需要在if語句中?

if(cur) 
     { 
      prev->next = cur->next; 
      delete cur; 
     } 
+0

孤立的代碼沒有意義,頭是什麼?這是一個對象的方法嗎?如果是這樣,它可能已在其他地方動態分配。而且,即使按照學術編碼的標準,這本教科書也很糟糕。未初始化的變量?讓人驚訝。 –

回答

5

首先,這段代碼假定節點是動態分配的。這就是鏈表通常被構造的方式。如果您的代碼使用棧中的節點,那麼只需刪除delete語句。 (並且稍微考慮一下如何跟蹤哪些節點正在使用)。

其次,該代碼塊是必需的,因爲它刪除了要刪除的節點 - 如果該節點存在。在節點不存在的情況下,它位於if塊中。在紙上繪製一個簡單的示例,並逐步瀏覽代碼,以查看如果嘗試刪除不在列表中的元素會發生的情況。

+2

只是爲了澄清Beta的觀點,'if(cur)'和'if(cur!= NULL)'是一回事' – zzxyz

+0

@zzxyz:是的,我應該解釋一下。謝謝。 – Beta

+0

謝謝,夥計們,真的清除了有關if語句的事情。不過,我不得不承認,在刪除似乎沒有新陳述的東西方面,我仍然有點困惑。我肯定錯過了什麼。 –

0

這是delete以前未用new分配的值不正確。我假設new-分配是由你的教科書隱含的。

關於你提到的第二個問題,後

while(cur!=NULL && cur->data != num){...} 

已經完成,無論是cur == NULLcur != NULL && cur->data == numif (cur)實際上是if (cur != NULL),這意味着cur包含您正在查找的值。

該塊本身需要通過將上一個元素的next指針更改爲元素來移除找到的元素,該指針位於被刪除元素之後。