3

私はチューターの助けを借りてリンクリストラボに取り組んでいますが、残念ながらしばらく前に彼らと連絡が取れなくなり、自分でこれを理解することができませんでした.

最初の while ループは、リンク リストを一度に 1 ノードずつ処理し、次に 2 番目の while ループに進みます。これはうまく機能しているようです。ただし、問題は、メンバーを削除すると、実際には先に進み、2 つ削除されることです。その前のものと、それが想定されているノードを削除します。

問題を list.cpp の 80 行目 (下記) に切り分けました。カーソル 2 のリンク フィールドを指す cursorOne の link_field が、2 つのカーソル間のすべてのノードを削除していると思いますが、これは私が望むものではありません。

では、カーソル 1 のリンク フィールドがカーソル 1 の次のリンク フィールドを指すようにする必要があると思います。私はとても近くに感じます..そして、このラボの難しい部分はすでに完了していますが、必要な最後のエウレカの瞬間はまだありませんが、私はそれをたくさん見てきました.

プログラムは次のとおりです。ノード クラスを使用し、それをリスト クラスで変更します。

よくよく考えてみると、ideone.com のコードにリンクできないと思います。そのため、これをできるだけ簡潔にして、ループを投稿するだけにします。ここにノードlist.cppがあります

      while(currentItem != NULL)
    {
        cout << "Enter Second Loop" << endl;
        cout << currentItem->data_field << " Curse 2" << endl;

        //compare it
        if (nodeToFindDuplicatesOf->data_field == currentItem->data_field)
        {

         //prev->next = current->next to delete
            // in order to delete only one, I must find a way to set the link_field of the previous node to cursor 1 to
            // the link field of the node that's to be deleted
            cout << nodeToFindDuplicatesOf->data_field << "being removed" << endl;
            predecessor = currentItem->link_field;
            delete currentItem;

            currentItem = nodeToFindDuplicatesOf; //set cursor2 to cursor1

        }
        currentItem = currentItem->link_field;
    }
    nodeToFindDuplicatesOf = nodeToFindDuplicatesOf->link_field;
    if (nodeToFindDuplicatesOf)
        currentItem = nodeToFindDuplicatesOf->link_field;
}

}

ノード クラスに以前のノード ポインタが必要ですか?

4

1 に答える 1

2

エラーを特定する際の分析は正しいです。currentItemリストから項目を削除するには、削除する項目(別名cursorTwo) とその前の項目の両方へのポインターが必要です。cursorOneただし、ポインターは の前身ではなく、重複cursorTwoを見つけたいノードへのポインターです。

エラーを修正するには、まず変数に意味のある名前を使用します。cursorOneまったく意味がなく、cursorTwoそれらの名前がエラーの原因である可能性が最も高いです。nodeToFindDuplicatesOfそれらを と と呼んでみませんcurrentItemか?(または、もっと良いものを思い付くことができるかもしれません。)

次に、 の前任者を追跡するために新しいポインターを導入する必要がありますcurrentItem

currentItem削除する必要がある場合はlink_field、その前身のを設定してから (事前delete currentItemに に設定せずに)。NULL

于 2013-04-11T18:45:33.707 に答える