0

LinkedList の末尾にノードを追加する関数を作成しようとしています。ループを使用してそれを行う方法は知っていますが、教授は特定の方法でそれを行うことを望んでおり、それが機能しない理由がわかりません。彼は実際にそのためのすべてのコードを私たちに与えました..

これは彼が私たちに与えた疑似コードです:

process append(data) 
  if (not the end)
     next->append(data);

  else
     next=new Node();
     next->data=data;
     next->data = nullptr; 

そして、これが私が思いついたものです:

struct Node {

int data;
Node* next;


};

struct LinkedList {
  Node* head;

  LinkedList() {head = nullptr;}

 void prepend(int data) {

  if (head == nullptr) {

       Node* tmp = new Node();
       tmp->data=data;
       tmp->next=nullptr;

}

  else  {

    Node* tmp = new Node();
    tmp->data=data;
    tmp->next=head;
    head=tmp;


  }
}

  void append(int data) {

  Node* tmp = head;

     if (tmp->next != nullptr) {

        tmp=tmp->next->append(data);

 }

else {

    tmp->next = new Node();
    tmp->next->data = data;
    tmp->next->next = nullptr;


    }


  }
};





int main()
{
    LinkedList LL = LinkedList();
    LL.prepend(7);
    LL.append(6);
    std::cout << LL.head->data << std::endl;
}

私のプリペンド (LinkedList の先頭に追加する) は正常に動作しますが、このコードを試すと、

main.cpp:48:20: エラー: 'struct Node' には 'append' という名前のメンバーがありません tmp->next->append(data);

したがって、next->append(data) と言うのには何か問題があると確信しています。これは、私が理解したことから、nullpointer に到達するまで append 関数を再帰的にコールバックすることになっています。何らかの書き方があるのではないかと思っているのですが、クラスの人から next->append(data) がうまくいくべきだと言われていて、なぜこれがうまくいかないのかよくわからないと思います。なんでも。代わりに Node 構造体に追加関数を記述しようとしましたが、 head がスコープで宣言されていないと表示され、これをどのように扱うか本当にわかりません。私はC ++のクラス/構造体も初めてなので、それについて私が理解していないことだと思います。

4

5 に答える 5

2

クラスNodeには名前の付いたメソッドがないappendため、次のエラー メッセージが表示されます。

tmp->next->append(data);
           ^^^^^^^^^^^^^

struct Node {

int data;
Node* next;

};

appendノードをリンク リストに追加するために、内にメソッドは必要ありませんNode。それを削除します。の追加プロセスを修正しますLinkedList::append

void append(int data) {

 Node* tmp = head;

 while (tmp->next)
     tmp = tmp->next;


  tmp->next = new Node();
  tmp->next->data = data;
  tmp->next->next = nullptr;
}

私はテストしませんでしたが、上記のコードのようなものが必要です。最初はリストの最後にアクセスしようとします。次に、ノードを追加します。


再帰的な実装:

void append(int data) {

   append(data, head);
}

void append(int data, Node *node) {

   if (node->next)
       append(data, node->next);
   else {
    tmp->next = new Node();
    tmp->next->data = data;
    tmp->next->next = nullptr;
  }
}
于 2013-10-10T08:18:44.033 に答える
0

構造体ノードで追加メソッドが定義されていません。代わりに、LinkedList クラスで定義されているため、それに応じて呼び出す必要があります。ノードをパラメーターとして受け取るように append メソッドを再定義するか、構造ノード自体に追加メソッドを追加することができます。また、追加の結果をに割り当てる必要はありませんtmp =

あなたの追加メソッドは無効です。

于 2013-10-10T08:18:12.810 に答える
0

tmp->next は Node であるため、append 関数を呼び出すには、Node 構造体で宣言する必要があります

于 2013-10-10T08:22:29.693 に答える
0

ノード構造には追加メソッドが含まれていません。さらに、1 つのメソッドで実行できる作業を 2 つのメソッドに分割し、より多くのコードを記述します。

私が書いた作業コードを使用して、別の質問への回答を参照してください。

https://stackoverflow.com/a/37358192/6341507

ご覧のとおり、メソッドですべて解決します

AddItem(int i)

リンクされたリストを作成することは、ここの多くの人々にとって一種の困難であることに気付き始めたので、そこでの回答をさらに編集して、追加情報を提供します。

幸運を!

于 2016-05-21T18:31:40.927 に答える