2017-07-06 33 views
0

我試圖從兩個鏈接列表中添加數字,並將其放入第三個。它增加了很好,但我的代碼塊編譯器停止響應,而運行此代碼可能是因爲無限循環或一些例外。在鏈接列表中添加兩個數字

以下代碼在鏈接列表中添加兩個以相反順序存儲的數字。

struct Node{ 
    int x; 
    Node* next; 
}; 

class LinkedList{ 

    public: 
     Node* head; 
     LinkedList(){ 
      head = NULL; 
     } 

     void addNode(int num){ 
      Node* n = new Node(); 
      n->x = num; 
      n->next = NULL; 
      if(head == NULL){ 
       head = n; 
      }else{ 
       Node* n1 = head; 
       while(n1 != NULL){ 
        if(n1->next == NULL){ 
         n1->next = n; 
         break; 
        } 
        n1 = n1->next; 
       } 
      } 
     } 

     int popNode(){ 
      int num = NULL; 
      if (head != NULL){ 
       num = head->x; 
       head = head->next; 
      }else{ 
       cout << "Yay" << "\n"; 
       num = NULL; 
      } 

      return num; 
     } 

     void printList(){ 
      Node* n1 = head; 
      while(n1 != NULL){ 
       if(n1->next == NULL){ 
        cout << n1->x << "\n"; 
       }else{ 
        cout << n1->x << "->"; 
       } 

       n1 = n1->next; 
      } 
     } 

}; 

LinkedList* add_nums(LinkedList* l1, LinkedList* l2) { 
    LinkedList l3; 

    int num1= (*l1).popNode(); 
    int num2= (*l2).popNode(); 
    int carry = 0; 

    while(num1 != NULL || num2 != NULL){ 
     int num3 = num1+num2+carry; 

     if (num3 > 9){ 
      int temp = num3 % 10; 
      carry = (num3 - temp)/10; 
      num3 = temp; 
     } 

     l3.addNode(num3); 
     l3.printList(); 
     num1 = (*l1).popNode(); 
     num2 = (*l2).popNode(); 
    } 

    return &l3; 

} 



int main(int argc, char const *argv[]) { 
    LinkedList list1; 
    LinkedList list2; 
    list1.addNode(2); 
    list1.addNode(4); 
    list1.addNode(3); 
    list2.addNode(5); 
    list2.addNode(6); 
    list2.addNode(4); 
    (*(add_nums(&list1, &list2))).printList(); 
    return 0; 
} 

誰能告訴我我做錯了什麼?

更改密碼輸入後,我應該做的,從下面的答案:

  1. 我應該從空改變整數初始化爲0。
  2. 應該使用LinkedList的對象來終止我的循環。
  3. 發生變更,我如何從一個指針

謝謝大家訪問功能。

+6

這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:[如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+1

同意。通過這種方式,您將能夠回答爲什麼它在運行此代碼時停止響應,可能是因爲無限循環或某種異常***而不是猜測。 – drescherjm

+5

'return &l3;':您返回對局部變量的引用:UB。 – Jarod42

回答

2

誰能告訴我我做錯了什麼?

  1. 恕我直言,你可能會做出錯誤的選擇。 STL提供了(雙向鏈接的)listforward list(它是單鏈接的)的數據結構。也許你想使用這些。您可以期望它們足夠高效,無缺陷並且很重要,可以知道您是否想成爲精通C++程序員。
  2. 讓別人做代碼審查是有意義的(有一個代碼審查StackExchange網站);例如在鏈表中命名整數變量x可能不被認爲是一種好的做法。
  3. 你沒有告訴我們你的程序有什麼問題。這在SO中預計。你的問題符合「脫離主題(爲什麼這個代碼不工作?」)。你提供了這個程序,這很好。但是你沒有提供你的預期輸入和輸出。你的計劃應該做什麼?如果我認爲您的main函數作爲測試,那麼您期望的結果是什麼?
  4. 看到下面的一些錯誤/警告

在功能popNode

int num = NULL; // should be 0, it's an integer 
... 
num = NULL; // same reason 

在功能add_nums

LinkedList l3; // it's a local variable (see return below) 
... 
while(num1 != NULL || num2 != NULL) // again num1 and num2 are integers 
.... 
return &l3; // address of a local variable :-(

我想還是你聲明變量l3作爲指向LinkedList

LinkedList *l3 = new LinkedList; 
... // adapt the code to use l3 appropriately 
return l3; 
+0

最後一部分解決了我的問題..雖然我自己發現了它。我有問,但是如果我分配0整數和檢查我的代碼中的0我會得到誤報,代碼可能無法正常工作。爲什麼將NULL分配給整數? –

+0

我的建議是提出一個新的問題,因爲它與UB /崩潰無關。請不要試圖改變這個問題的主題,因爲它被回答/接受。你也必須更具體。 – drescherjm

+0

我已經提到我的程序應該在描述中做什麼。我在兩個鏈表中添加數字。 –

2

正如其他的評論說,你的錯誤是這樣一個:return &l3;

l3是一個本地對象,只是該函數結束之前被刪除,這樣是不是dinamically分配的任何對象。這是因爲LinkedList對象的範圍

你應該寫:

LinkedList* l3 = new LinkedList(); 
//... 
//... 
return l3; 

此功能現在返回一個指向你的對象。

注意:包含該指針的變量l3在該函數之前被刪除,但它並不重要,因爲對象生存期不再與該函數綁定。