2013-05-19 49 views
1

我正在遞歸地向列表中添加一個元素,編寫一個插入函數。問題是當我運行程序並嘗試插入時,它只是插入一次,然後在第二次中斷時並有一個錯誤。 任何建議,感謝名單鏈接列表插入函數遞歸C++

輔助函數:

void List::insertHelper(Node* list, int number) 
     { 
      if(list->next != NULL) 
      { 
       insertHelper(list->next, number); 
      } 
      else 
      { 
       list->next = new Node; 
       list->next->data = number; 
      } 

     } 

此功能時,我所說的遞歸一個:

void List::insert(int d) 
    { 
     if(head == NULL) 
     { 
      head = new Node; 
      head->data = d; 
     } 
     else 
     { 
     insertHelper(head, d); 
     } 

    } 
+0

有什麼*編譯*?在這段代碼中沒有'Insert'函數,但是它從List :: insert中調用,也沒有叫Node的類/結構,也沒有叫做'head'的全局變量。請發佈* real *代碼。 – WhozCraig

+0

插入函數是insertHelper。 thx – Mido

+1

我的心理調試器告訴我'Node'的構造函數永遠不會將'Node :: next'設置爲NULL,而且這段代碼的其餘部分也不會。你的'Node :: Node()'構造函數應該接受一個數據元素並且初始化'data'成員和'next',比如Node :: Node(int data):data(data),next(NULL) {}' – WhozCraig

回答

1

您的問題是缺乏如下:

list->next->next = NULL; 

在insertHelper的else部分。至於「建議」部分,如果可以幫助,請避免遞歸處理列表。你(未來)的同事不會理解它。

+0

是的,你說得對,謝謝! – Mido

1
void List::insertHelper(Node* list, int number) 
     { 
      if(list->next != NULL) 
      { 
       insertHelper(list->next, number); 
      } 
      else 
      { 
       list->next = new Node; 
       list->next->data = number; 
       list->next->next=NULL; // You are missing this line.... becuase of this.. new nodes next remains as dangling pointer instead of null.. 
      } 

     } 
+0

+1(雖然它實際上是一個*不確定的指針*,不是一個懸掛的指針,dangler是一個有效的指針,然後釋放/釋放,然後無效)。另外,一個體面的構造函數可以更好地解決這個問題,因爲它可以確保Node的所有實例都有一個初始化的指針。不只是這裏創建的那個。 – WhozCraig

1

每次插入新節點時,都必須將該新節點的下一個值設置爲NULL。否則,每次調用insertHelper時都會得到一些垃圾指針值。

這裏是修改後的代碼。

void List::insertHelper(Node* list, int number) 
    { 
     if(list->next != NULL) 
     { 
      insertHelper(list->next, number); 
     } 
     else 
     { 
      list->next = new Node; 
      list->next->data = number; 
      list->next->next = NULL; //MODIFIED LINE 
     } 

    } 

void List::insert(int d) 
    { 
     if(head == NULL) 
     { 
      head = new Node; 
      head->data = d; 
      head->next = NULL; //MODIFIED LINE 
     } 
     else 
     { 
      insertHelper(head, d); 
     } 

    } 

這應該有希望工作。

+0

是的,它是固定的,謝謝你的回答 – Mido