2017-07-06 14 views
0

2つのリンクされたリストから数字を追加して、それを3番目のリストに追加しようとしています。これはうまく追加されますが、私のコードブロックコンパイラは無限ループまたは何らかの例外のためにこのコードを実行している間に応答を停止します。リンクされたリストに2つの数字を追加する

次のコードは、リンクされたリストに逆の順序で格納された2つの数値を追加します。

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

誰でも私が間違っていることを教えてもらえますか?

変更点以下の回答から入力した後、私が何をすべきコーディングする:私は0

  • にNULLから整数の初期化を変更する必要があります

    1. は私のループを終了するのLinkedListオブジェクトを使用する必要があります。
    2. 私はポインタ

    からの機能にアクセスする方法をみんなありがとうを変更する必要があります。

  • +6

    デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:[小さなプログラムをデバッグする方法](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. は、私はあなたのように変数l3を宣言する方が良いと思いますいくつかのエラー/警告機能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 :-(
      

    機能で

    popNode

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

    下記参照しますLinkedListへのポインタ:

    01へのポインタコメントに他の人が言うように
    LinkedList *l3 = new LinkedList; 
    ... // adapt the code to use l3 appropriately 
    return l3; 
    
    +0

    最後の部分は私の問題を解決しました。私自身でそれを発見しました。私はしかし、もし私が整数を0に割り当てて、私のコードで0をチェックすれば、私は偽陽性となり、コードがうまくいかないかもしれません。整数をNULLに間違って割り当てるのはなぜですか? –

    +0

    私のアドバイスは、UB /クラッシュとは関係ないので、新しい質問をすることです。この質問のトピックは、回答/承認されているので、変更しないでください。また、より具体的にする必要があります。 – drescherjm

    +0

    私は自分のプログラムがこの記述で何をすべきかを述べました。私は2つのリンクリストに数字を追加しています。 –

    2

    は、あなたのエラーは、このいずれかになります。return &l3;

    l3がローカルオブジェクトであり、dinamically割り当てられていない任意のオブジェクトのように、単に機能の終了前に削除されます。これは、LinkedListオブジェクトのスコープが原因です。

    あなたが書かれている必要があります。

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

    をこの関数は、今、あなたのオブジェクトへのポインタを返します。

    NB:ポインタを含む変数l3は、関数の直前で削除されますが、オブジェクトの存続期間が関数にバインドされていないため問題ありません。

    関連する問題