0

そのため、C ++で単純なリンクリストを実装しようとしていますが、クラスのpushメソッドに問題があります。基本的に、最初のノードをリストに追加すると、すべてがうまくいきます。ただし、2番目のノードを追加すると、それ自体を指すことになります(つまり、secondNode.next ==&secondNode)。

class linkedList
{
    public:
    node head;
    linkedList()
    {
        head.next = NULL;
    }
    void push(node new)
    {
        if(head.next == NULL)
        {
            head.next = &new;
            new.next = NULL;
        }
        else
        {
            new.next = head.next;
            head.next = &new;
        }
    }
};

何が悪いのかわからなかった…どんな助けでも大歓迎です。

4

2 に答える 2

2
void push(node new)

次のように、オブジェクトのコピーを作成する必要はありません。

void push(node& new)

それ以外の場合は、関数の最後に削除されたオブジェクトのアドレスを取得しています

于 2012-05-26T23:35:18.653 に答える
0

少なくとも私の意見では、ある程度間違っていることがいくつかあります。

まず、実際には a であってはheadなりませんnode-- それは であるべきnode *です。少なくとも見た目からすると、これを使用するのはそのnextポインターだけなので、単にポインターにして、それで終了することもできます。

次に、リストの先頭に新しい項目を挿入するために、リストの先頭が null ポインターであるかどうかを実際に確認する必要はありません。

第三に、ノードへの参照を使用するという@lezebulonの提案は機能しますが、この場合、それが実際に最善の方法だとは思いません。ユーザーにnodeへのポインターまたは参照を渡させるのではなく、実際にはデータ項目を渡すだけでよく、連結リスト クラスはノードを割り当ててその項目をリストに保持する必要があります。

template <class T>
class linked_list { 

    class node { 
        T item;
        node *next;
    public:
        node(T const &data, node *next_node) : item(data), next(next_node) {}
    };

    node *head;
public:

    linked_list() : head(NULL) {}

    void push(T const &data) {
        head = new node(data, head);
    }
};
于 2012-05-27T00:09:43.897 に答える