【问题标题】:Is p->next->prev the same as p?p->next->prev 和 p 一样吗?
【发布时间】:2016-06-02 15:25:14
【问题描述】:

我正在为我的 Uni 做一个 Linked List 实现,我在我们的演示文稿中遇到了这段代码。

template <class X> bool linkedList<X>::deleteElement(node<X> *p)
if (p=NULL)
    return false;
if(p->next!=NULL)
    p->next->prev = p->prev;
if(p->prev!=NULL)
    p->prev->next = p->next;
else
    head = p->next

我想知道 p-&gt;next-&gt;prev = p-&gt;prev; 部分是否与 p = p-&gt;prev; 相同,因为 p 的下一个的前一个是 p 本身。

提前感谢您的任何回答。

编辑 1:修正了一个错字并添加了更多代码以使其更清晰。

【问题讨论】:

  • 代码会严重崩溃。如果p-&gt;nextNULL,那么p-&gt;next-&gt;prev 会给你一个空指针异常。代码毫无意义。一定有错别字。
  • 如果您绘制方框和箭头的图片,使用指针总是更容易。一直帮助我。
  • @Hogan 我用链表编程语言已经 35 年了。我有时仍然需要绘制这些图表(我本周早些时候在回答另一个问题时做了)。 :)
  • @Barmar 有人说“计算机科学中没有不能用另一层间接解决的问题”我认为说“没有不能解决的问题”更清楚使用另一个框和箭头。”

标签: c++ linked-list


【解决方案1】:

我想知道p-&gt;next-&gt;prev = p-&gt;prev; 部分是否与p = p-&gt;prev 相同

不,不是。它正在设置列表中p 节点之后的next 节点的prev 字段。

代码正在从列表中删除p 节点。 p 节点两侧的两个 周围节点需要更新为停止指向p 节点,而是相互指向。您显示的只是必要更新的一半。您需要添加另一半:if (p-&gt;prev != NULL) p-&gt;prev-&gt;next = p-&gt;next;。您还需要检查p 是否指向列表的头节点,如果是,则将头更新为指向p-&gt;next。同样,列表的尾节点(如果有)指向p-&gt;prev

另外,你的代码中的if(p=NULL) 是错误的,它应该是if(p==NULL)。而且你代码中的if(p-&gt;next==NULL)也是错误的,应该是if(p-&gt;next!=NULL)

这是正确的实现:

template <class X> bool linkedList<X>::deleteElement(node<X> *p)
{
    if (p == NULL)
        return false;
    if (p->next != NULL)
        p->next->prev = p->prev;
    if (p->prev != NULL)
        p->prev->next = p->next;
    if (p == head)
        head = p->next;

    // if your list has a tail:
    if (p == tail)
        tail = p->prev;

    // if your list owns the memory for the nodes:
    delete p; // or however you free it

    return true;
}

最后,您应该考虑使用 STL std::list 容器而不是手动实现。

【讨论】:

  • 啊,你的解释很有道理。我的思绪卡住了很长一段时间,但你让我明白了。非常感谢!
  • 是的,基本上你想销毁所有p存在的证据。你不能只通过修改 p 自己的变量来做到这一点。所以你需要修改其前身的next和后继的prev指针。顺便说一句,从头开始实现你自己的链表是一个很好的练习,它迫使你在实现它们之前考虑这些事情。
  • 在 Remy 和 @potAito,我正在自己进行实施以进行练习。确实,这会让你站起来寻找那些细节(或者我认为它们是细节,因为我不熟悉)。
【解决方案2】:

不完全是。 p 是一个局部变量。 p-&gt;next-&gt;prevp-&gt;next 上的一个实例变量。改变前者根本不会影响结构,而改变后者会。换句话说,它们的可能相同,但存储这些值的内存地址不同。

【讨论】:

  • 感谢您指出错字。至于这个问题,我认为箭头符号让我感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2021-12-21
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多