2017-03-03 7 views
-2

私はもちろん、リンクされたリストのヘルプをたくさん見てきましたが、私は何が間違っているのか分かりません。私は他のコードのロジックを理解していると思うが、何かが私のものであり、正しく動作させることができない。機能のリンクされたリスト、どこで私のロジックに欠陥がありますか?

コード:

void SparseM_list::newTerm(valueType newValue, int row, int column) 
MatrixTerm *n = new MatrixTerm; 
     n->next = NULL; 
     n->column = column; 
     n->row = row; 
     n->value = newValue; 
     if (head != NULL) 
     { 
      cur = head;  
      while (cur->next != NULL) 
      { 
       cur = cur->next; 
       cout << "does it ever get inside the while loop? cur and curnext -> " << cur << " " << cur->next << endl; <-- never outputs 
      } 
      cur->next = n; 
     } 
     else //if head is null, n will be the starting point 
     { 
      head = n; 
     } 
     delete n; 

    } 

と下記だから基本的に私のロジックは、この

  1. あるリンクリストに

    struct MatrixTerm { 
         valueType value; //store value of matrix element 
         int column; //store column position 
         int row; //store row position 
         MatrixTerm *next; //point to next node in the linked list 
        }; 
    
        MatrixTerm *head; //head point for the linked list 
        MatrixTerm *cur, *prev; 
    

    を使用して、私の疎行列のプライベート構造体/変数であります新しい用語情報はMatrix Term nに動的に割り当てられます。ヘッドは(デフォルトコンストラクタで設定されている)、その後、ヘッド= N nullの場合

  2. データの
  3. 第二セットが=!。頭の中でヌルを行くので、私は頭に等しいCURポインタを設定
  4. 一方、head-> nextはnullでなければならないので、cur-> nextはnullにする必要があるため、2番目のデータのループはスキップされます。 cur-> nextをnに設定します。
  5. 3番目のデータが入ります。Cur-> nextは前のnと同じなので、whileループに入ります。現在はcur-> nextに設定されています。 whileループの状態をチェックすると、cur-> nextはnullになるはずなので、cur-> next = n(3番目のデータセット)の設定に行きます。

ただし、whileループに入ることはありません。どこで私は物事を台無しにしていますか? whileループは、リンクされたリストをトラバースするために使用されます。

答えて

1

この文

delete n; 

は意味がありません。それを除く。

最初にデータメンバーheadが実際にNULL(またはnullptr)に設定されていることを願っています。

リストは、1人の以上のデータメンバーtailを宣言する参考になる新しいノードを追加することを可能にする場合は、関数の代替実装は

void SparseM_list::newTerm(valueType newValue, int row, int column) 
{ 
    MatrixTerm *n = new MatrixTerm { newValue, column, row, nullptr }; 

    MatrixTerm **current = &head; 

    while (*current) current = &(*current)->next; 

    *current = n; 
} 

のように見えることができます。この場合、ループを実行するたびに効率的な新しいノードがテールに追加されます。

また、データメンバcurprevを削除し、それらをメソッドのローカル変数として使用します。

+0

実際にポインタを割り当てていて、それを削除すると、cur-> nextがNULLを指すたびに – Kochoba

0

リストノードのメモリを解放するため、delete n;を使用しないでください。あなたは、あなたは鍵をロックに押し込んだままにしていますが、ドアを開ける前に鍵を抜きます。あなたは家に入ることができますか?

ps、削除するノードはリストオブジェクトのデソルタに保持する必要があります。

関連する問題