2016-09-02 20 views
-3

私は、パラメータが前のノードへのポインタである挿入メソッドを作成しようとしています。しかし、私の移植には欠陥があります。C++単リンクリストの挿入?

test.insert(n2->_next, 4);のように挿入すると機能しますが、これは以前のポインタではありませんか? test.insert(n2, 4);のように呼び出された場合、ノードは挿入されませんか?

どこの人に教えてもらえますか?

メソッド(クラスLLToolkitの一部):

void insert(Node<t>* &prevPtr, t data) 
{ 
    if (prevPtr == nullptr) return; 
     prevPtr->_next = new Node<t>(data, prevPtr->_next); 
} 
void headInsert(Node<t>* &headPtr, t data) 
{ 
    headPtr = new Node<t>(data, headPtr); 
} 

ノード

template<typename t> 
class Node 
{ 
public: 
Node() 
{ 
    _next = nullptr; 
    _data = data(); 
} 

Node(t data = t(), Node<t>* next = nullptr) : _next(next), _data(data) {} 

~Node(){ cout << "delete " << _data << _next << endl; } 

    Node<t> *_next; 
    t _data; 
}; 

マイ試験:

int main() 
{ 
    LLToolkit<int> test; 

    Node<int>* n1 = new Node<int>(1, nullptr); 
    Node<int>* n2 = new Node<int>(2, n1); 
    Node<int>* n3 = new Node<int>(3, n2); 

    test.headInsert(n1, 1); 
    test.headInsert(n2, 2); 
    test.headInsert(n3, 3); 

    // Order is now 3 - 2 - 1 

    // Should insert new node after n2 
    // Like this 3 - 2 - 4 - 1 
    test.insert(n2, 4); 

    return true; 
} 

ここで新しいノードが挿入されるべきグレーマークで

enter image description here

以下のようなの行為。

あなたのコードに続いて

enter image description here

+2

インプラントをインターフェイスから隠そうとする必要があります。新しいノードと 'headInsert'を作成せず、必要に応じて新しいノードを作成させます。データを' LLToolkit'にプッシュするだけです。 –

+0

はい、これは学校の割り当てであり、プロトタイプがクラスに与えられました。だから私はそれを実装し、このようにテストしなければなりません。 @LogicStuff私の悪い私はノードの後に​​ment。 – Mat0

+0

@ Mat0 *しかし、これは学校の割り当てです* - 先生はメンバーの初期化リストを使用しませんでした。残りのコースではそれほどうまくいきません。また、リスト内に単一のノードを作成するために2つのノードを動的に割り当てるのはなぜですか?あなたの 'main'関数は' new'を使い、あなたが呼んでいる関数は 'new'をもう一度使っています。良いリンクリストはリンクされたリストのユーザーに "ノード"について何も知らせてはいけません。テストプログラムは、データを挿入するようにリンクリストに要求するだけで、内部的に作成する必要のあるノードをリンクリストクラス自体が作成できるようにする必要があります。 – PaulMcKenzie

答えて

2

以下のように動作するはずです、あなたは次のことをやっているようです。

  1. 値1とヌルネクストポインタを持つ新しいノードを作成します。

    Node<int>* n1 = new Node<int>(1, nullptr); 
    

    結果:

    n1(=1) -- nullptr 
    
  2. 値2とn1への次のポインタで新しいノードを作成します。

    Node<int>* n2 = new Node<int>(2, n1); 
    

    結果:

    n2(=2) -- n1(=1) -- nullptr 
    
  3. 値3とn2への次のポインタで新しいノードを作成します。

    Node<int>* n3 = new Node<int>(3, n2); 
    

    結果:

    n3(=3) -- n2(=2) -- n1(=1) -- nullptr 
    
  4. が値3、n1の次のポインタを使用して新しいノードを作成し、その代わりに新しいノードを指すようにn1を変えます。

    test.headInsert(n1, 1); 
    

    結果:

        n1(=1) 
            | 
            | 
    n3(=3) -- n2(=2) -- nn1(=1) -- nullptr 
    
  5. n2n3で同じことを行う:

    結果:

    n3(=3)  n2(=2)  n1(=1) 
        |   |   | 
        |   |   | 
    nn3(=3) -- nn2(=2) -- nn1(=1) -- nullptr 
    
  6. n2の後に4を挿入します。

    結果:

    n3(=3)  n2(=2)  n1(=1) 
        |   |   | 
        |   nn4(=4)  | 
        |   |   | 
    nn3(=3) -- nn2(=2) -- nn1(=1) -- nullptr 
    

そこで質問ですが、これはあなたが望むものは本当にありますか?申し訳ありませんが、私はあなたのコードを誤解した場合、私はここでそれをコンパイルできない場合、一種の難しいです。

+0

headInsertを追加して、どのように動作するかを確認できます。コンソール出力を見ると、[ノードのアドレス] [データ] [次のノードのアドレス]のように表示されます。ポインタが接続されている – Mat0

関連する問題