【问题标题】:Problems replacing head of a linked list替换链表头的问题
【发布时间】:2012-12-03 03:27:55
【问题描述】:

编写一个函数来对链表进行头部插入。将对象插入头部并重新附加列表时,它工作了一半,但我以某种方式丢失了列表中的原始头节点。

如果列表是 [green, red, blue] 并且我尝试插入黄色,它会起作用,但新列表将是 [yellow, red, blue]。

节点类是:

template<class T>
class Node
{
public:
    Node(T theData, Node<T>* theLink) : data(theData), link(theLink){}
    Node<T>* getLink( ) const { return link; }

    const T& getData( ) const { return data; }

    void setData(const T& theData) { data = theData; }
    void setLink(Node<T>* pointer) { link = pointer; }

private:
    T data;
    Node<T> *link;
};

List 被存储在一个队列中,因此 head insert 是该类的一个方法。队列前后都有私有变量,指向列表的相应位置。

template<class T>
void Queue<T>::headInsert(T& theData)
{
   Node<T> *temp;
   temp = front->getLink();
   front->setLink(new Node<T>(theData, temp->getLink() ));
   front = front->getLink();
}

【问题讨论】:

  • 为什么要使用 getter 和 setter?只需将它们设为公共成员即可。
  • 你可能想看看工作code for a linked list
  • @Pubby:总的来说,我会同意这种微不足道的结构。不过,拥有 getter 和 setter 并没有什么坏处。但它确实增加了添加验证逻辑的灵活性。您可以在 setter 中添加代码以检测是否会发生循环。这在调试版本中很有用。

标签: c++ linked-list


【解决方案1】:

您的问题在于您的setLink 电话:

template<class T>
void Queue<T>::headInsert(T& theData)
{
   Node<T> *temp;
   temp = front->getLink();
   front->setLink(new Node<T>(theData, temp->getLink() )); // Right here
   front = front->getLink();
}

你实际上有很多问题。首先,假设我们有以下测试列表:

front = Red -&gt; Green -&gt; Blue -&gt; NULL

调用temp = front-&gt;getLink() 产生以下输出:

temp = Green -&gt; Blue -&gt; NULL.

new Node&lt;T&gt;(theData, temp-&gt;getLink()) 调用,其中theData = Yellow,然后产生:

new Node&lt;T&gt;(theData, temp-&gt;getLink()) = Yellow -&gt; Blue -&gt; NULL.

拨打front-&gt;setLink(new(...)然后给你:

front = Red -&gt; Yellow -&gt; Blue -&gt; NULL

最后,front = front-&gt;getLink():

front = Yellow -&gt; Blue -&gt; NULL.

这不是你想要的。您只需将yellow 放在列表的最前面即可:

template<class T>
void Queue<T>::headInsert(T& theData)
{
   front = new Node<T>(theData, front);
}

无需修改内部指针。只需将 front 指向包含您的数据的新节点,它的 next 指针指向旧数据。

【讨论】:

  • 感谢您的快速回答,但它仍然在做同样的事情。
  • @frankV:查看我的编辑。我忽略了在我建议更换的那一行之后看到的错误。
  • 应该是Node&lt;T&gt; *next...
  • 它仍然在做同样的事情。
  • 为什么不只是front = new Node&lt;T&gt;(theData, front-&gt;getLink())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2011-09-07
  • 2014-06-12
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多