p-> next-> prev与p相同吗?

时间:2016-06-02 15:25:14

标签: c++ linked-list

我正在为我的Uni做一个链接列表实现,我在演示文稿中遇到了这个代码。

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->next->prev = p->prev;部分是否与说p = p->prev;相同,因为下一个p的前一个是p本身。

提前感谢您的任何答案。

编辑1:修正了拼写错误并添加了一些代码以使其更加清晰。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:8)

  

我想知道p->next->prev = p->prev;部分是否与说p = p->prev

相同

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

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

此外,代码中的if(p=NULL)错误,应该是if(p==NULL)。代码中的if(p->next==NULL)也是错误的,而应该是if(p->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容器而不是手动实现。