0

我正在为此苦苦挣扎。我已经让它显示了大部分列表,但是其中一个 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
4

2 回答 2

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

    newNode = new DoublyLinkedList(data);

if (mNext == NULL)
    mNext = newNode;

else

这不是连接新节点的反向指针。

您的代码也可能有更多错误。


编写双向链表的一种简单方法是

  • 区分列表节点类型,以及
  • 使每个列表始终有一个虚拟节点,称为头节点

这样你就没有NULL指针要处理了。

它确实简化了事情。

于 2012-10-03T04:10:38.017 回答
0

这段代码是问题所在(在插入函数中)

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

你需要

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

您的原始代码将在以下情况下工作,除非您尝试插入小于或等于当前第一个节点中的数据的数据。

另外,我假设您的构造函数将 mNext 和 mPrevious 初始化为 NULL。如果没有,您将遇到其他问题。

于 2012-10-03T05:49:21.470 回答