1

私は初めて連結リストを扱っており、二重連結リストの最後にノードを挿入できる関数を作成する必要があります。これまでのところ、

void LinkedList::insertAtTail(const value_type& entry) {
    Node *newNode = new Node(entry, NULL, tail);
    tail->next = newNode;
    tail = newNode;
    ++node_count;
}

Node クラスは、格納する値、次に指すポインターの値、前のポインターの値をこの順序で受け入れます。ここにノードを挿入しようとすると、未処理の例外があり、0x00000008 への書き込み中にアクセス違反があったというエラーが表示されます。

ここで何が問題なのか完全にはわかりませんが、エラー メッセージに基づいて null ポインターを逆参照することと関係があると思います。この問題を解決するための助けをいただければ幸いです。

編集:

tail はリストの最後のノードを指すポインタです。Tail->next は、最後のノードの次の変数にアクセスします。この変数は、関数の実行前は NULL を指しますが、実行後は、作成された新しいノードを指す必要があります。

4

3 に答える 3

8

は最初にどこtailを指していますか? NULL の場合、最初の要素を挿入しようとするときに null ポインターを逆参照します。

tail逆参照する前にテストすると役に立ちますか?

void LinkedList::insertAtTail(const value_type& entry) {
    Node *newNode = new Node(entry, NULL, tail);
    if (tail)
        tail->next = newNode;
    tail = newNode;
    ++node_count;
}

tailが nullで、アドレス 0x00000000 + 8 である 0x00000008 にあるoffsetof(Node, next)ため、アクセス違反を説明する 8 の場合、に割り当てると、そのアドレスでメモリに書き込もうとします。これはまさにあなたが見ているエラーです。tail->nexttail->next

于 2012-10-09T00:21:47.620 に答える
1

挿入操作の前のリストの状態を知らずにエラーの原因を特定することは困難です (ちなみに、これは実際には挿入操作ではなく追加操作です)。

空のリストに追加する最初のケースを処理していない可能性があります。基本的なアルゴリズムは次のとおりです (空のリストは NULL ヘッド ポインターで示され、それ以外はすべて不確定です)。

def append (entry):
    # Common stuff no matter the current list state.

    node = new Node()
    node->payload = entry
    node->next = NULL

    # Make first entry in empty list.

    if head = NULL:
        node->prev = NULL
        head = node
        tail = node
        return

    # Otherwise, we are appending to existing list.

    next->prev = tail
    tail->next = node
    tail = node
于 2012-10-09T00:20:07.253 に答える
1

LinkedList に頭と尾の両方があると仮定して、試してみてください。

void LinkedList::insertAtTail(const value_type& entry) 
{
    Node *newNode = new Node(entry, NULL, tail);
    if (tail)
        tail->next = newNode;
    tail = newNode;
    if (!head)
        head = newNode;
    ++node_count;
}

暗闇の中でのショット

于 2012-10-09T00:25:20.253 に答える