0

リンクリストを実装しようとしています。

リストにはプライベート変数 *head、*tail、count があります。

データ構造のロジックは理解していますが、確かに C++ は初めてなので、コンストラクターを間違って使用しているように感じます。

*head と *tail はリスト ノード ポインターです。リストノードは、前と次へのポインターを持ちます (二重にリンクされたリスト)。

ここに私が試したものがあります:

List::List():head(), tail(), count(0) {
    head->previous = NULL; 
    head->next = tail;
    tail->previous = head; 
    tail->next = NULL; 
}

私のプログラムはコンパイルされますが、このコンストラクターで新しいリストを作成しようとするとクラッシュします。助言がありますか?

4

1 に答える 1

2

通常、headtailは空のリストの null ポインターになるため、次のように逆参照します。

head->previous = NULL;

未定義の動作になります。

コンストラクターは次のようになります。

List::List() : head(0), tail(0), count(0) {}

(または、C++ が十分に進んでいる場合はnullptrfor headand を使用します)。tail

リストの最初と最後にダミー ノードを配置するのが好きなタイプの人は、それらを使用する前にそれらを割り当てる必要があります。

List::List() : count(0) {
    head = new somethingOrOther();
    tail = new somethingOrOther();

    head->previous = NULL; 
    head->next = tail;

    tail->previous = head; 
    tail->next = NULL; 
}

このトリックは、最後に挿入するか最初に削除するかを気にする必要がないため、リストの挿入と削除を大幅に簡素化するためによく使用されます。

欠点は、リストのトラバーサルとノードの検索 (削除を含む) を開始しhead->nextて終了する必要tail->previousがあることですが、多くの場合、以前の問題を心配するよりも簡単です。

于 2013-09-13T06:26:54.670 に答える