順序付けられた二重リンクリストを逆方向に表示するには?[定休日]

StackOverflow https://stackoverflow.com//questions/12701730

質問

私はこれに苦労しています。私はリストのほとんどを表示するためにそれを持っていますが、1のうちの1つが表示されていないので、私の人生はそれを修正する方法を理解

ここに関連するコードがあると思います。

私の挿入機能:

 template <class T>
 void DoublyLinkedList<T>::insert(T data)
 {
    DoublyLinkedList<T> *newNode, *tmp, *oneBefore;

    newNode = new DoublyLinkedList(data);

if (mNext == NULL)
    mNext = newNode;

else
{
   oneBefore = mNext;
   tmp = mNext;

    while (tmp != NULL && tmp->mData < data)
    {
        oneBefore = tmp;
        tmp = tmp->mNext;
    }

    if (tmp == mNext)
    {
        newNode->mNext = mNext;
        mNext = newNode;
    }
    else
    {
        oneBefore->mNext = newNode;
        newNode->mNext = tmp;
        newNode->mPrevious = oneBefore;
    }

   }
 }

私のdisplayBackwards関数:

 void displayBackward(DoublyLinkedList<int> *ptr)
 {
    DoublyLinkedList<int> *tmp;

    tmp = ptr;
    while (tmp != NULL)
    {
       cout << tmp->getData() << endl;
       tmp = tmp->getPrevious();
    }
 }

私の主な機能の関連部分は:

    DoublyLinkedList<int> *ptr, *head, *tail;

    ptr = new DoublyLinkedList<int>;

    cout << "Testing Insert\n";
    ptr->insert(1);
    ptr->insert(2);
    ptr->insert(3);
    ptr->insert(1);

    tail = ptr;
    while (tail->getNext() != NULL)
       tail = tail->getNext();

    cout << "\n\nTesting displayBackward\n";
    displayBackward(tail);

私の出力は現在:

 Testing displayBackward
 3
 2
 1
役に立ちましたか?

解決

このコードは問題です(insert関数内)

    if (tmp == mNext)
    {
        newNode->mNext = mNext;
        mNext = newNode;
    }

あなたが必要とする

    if (tmp == mNext)
    {
        newNode->mNext = mNext;
        mNext->mPrevious = newNode;
        mNext = newNode;
    }

元のコードは、現在の最初のノードのデータ以下のデータを挿入しようとする場合を除き、ケースで機能します。

また、コンストラクタがmNext&mPreviousをNULLに初期化すると仮定しています。そうでない場合は、他の問題が発生します。

他のヒント

 template <class T>
 void DoublyLinkedList<T>::insert(T data)
 {
    DoublyLinkedList<T> *newNode, *tmp, *oneBefore;

    newNode = new DoublyLinkedList(data);

if (mNext == NULL)
    mNext = newNode;

else

これは、新しいノードのバックポインタをリンクしていません。

あなたのコードにももっと間違っているかもしれません。


二重リンクリストをコード化する簡単な方法は次のとおりです

  • を区別します。 リストノード 型、および
  • 各リストには、常にaと呼ばれるダミーノードが1つあります ヘッダーノード.

そうすれば、あなたは何を持っていません NULL に対処するためのポインタ。

それは本当に物事を簡素化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top