順序付けられた二重リンクリストを逆方向に表示するには?[定休日]
-
12-12-2019 - |
質問
私はこれに苦労しています。私はリストのほとんどを表示するためにそれを持っていますが、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
に対処するためのポインタ。
それは本当に物事を簡素化します。
所属していません StackOverflow