2013-12-12 64 views
0

我的程序應該做3個操作:1.插入2.刪除3.使用雙向鏈接列表顯示...我在刪除功能中存在問題。這裏是代碼:刪除雙向鏈表中的一個項目

void List::del() 
{ 
    int num; 
    Node *Aux1=first; 
    Node *Aux2=NULL; 
    if(isempty()) 
     cout<<"List is Empty!"<<endl; 

    else 
    { 
     cout<<"Enter the number that you want to DELETE:"<<endl; 
     cin>>num; 
     while(Aux1->info!=num && Aux1 != NULL) 
     { 
      Aux2=Aux1; 
      Aux1=Aux1->left; 
     } 
     if(Aux1!=NULL) 
     { 
      if(Aux2!=NULL) 
      { 
       if(Aux1->left==NULL) 
        Aux2->left=NULL; 
       else 
       { 
       Aux2->left=Aux1->left; 
       Aux1=Aux1->left; 
       Aux1->right=Aux2; 
       } 
      } 
      else 
      { 
       first=Aux1->left; 
       //first->right=NULL; 
      } 
     } 
     system("pause"); 
    } 
} 

在刪除功能我想找到用戶想要刪除,然後從列表中刪除數...問題是當用戶輸入一個數字,不存在在列表中!在這種情況下,我希望我的程序不要在列表中不做任何事情,也不要從列表中刪除任何項目。但是當它發生時,我遇到這樣的錯誤:

App Crash Window

有什麼錯我的代碼? ; - ?

+0

你正在分段故障!有適當的空檢查 –

回答

1

您的while循環在檢查NULL指針是否爲NULL之前取消引用NULL指針。您需要將循環改成這樣:

while(Aux1 != NULL && Aux1->info!=num)

+0

哦,這是一個愚蠢的錯誤:| TNX我的問題現在解決 –

0

有問題的部分是以下部分:

while(Aux1->info!=num && Aux1 != NULL) 
    { 
     Aux2=Aux1; 
     Aux1=Aux1->left; 
    } 

取消引用輔助1檢查,如果它是NULL之前。因此,你將在這個循環中出現分段錯誤。

但是,數據結構存在更嚴重的問題。

首先,您的字段名稱有點奇怪。通常,雙向鏈表分別具有前一個和後一個指針,分別用於前一個和後一個元素。

其次,您實際上並不計數物品,而是依賴其信息字段。但是你永遠不會更新這個領域,所以過了一段時間,這個ID將變得毫無意義和碎片化。

考慮以下情況:用戶輸入五個節點的情況下:

0 --> 1 --> 2 --> 3 --> 4 

現在你罵刪除(2):

0 --> 1 --> 3 --> 4 

現在你的用戶要麼讓所有的ID呈現和選擇正確的一個,在這種情況下會發生分段錯誤 - 現在如果用戶再次調用delete(2)會發生什麼? 通常情況下,人們不會通過幻數ID號刪除節點,而是會有一個指向需要刪除的節點的指針。

NodePayload* delete(Node* node) 

這將然後刪除相應的節點和任選的指針返回到實際刪除節點/或它的有效載荷。由於通常出於內存管理原因,您的List類可能會分配節點,但不會分配它們的有效負載,因此用戶可以使用帶有分配的自定義有效負載的List。

+0

有幫助,但我想說如果我再次調用刪除(2)什麼都不會發生!當我將循環更改爲:while(Aux1!= NULL && Aux1-> info!= num)並且第二次調用delete(2)時,什麼都沒有發生,我仍然有這些數字:0 - > 1 - > 3 - > 4! –

+0

如果這是你的意圖,那很好。它似乎應該是要刪除的項目的索引 - 這不會起作用。 – FRob