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

Geo*_*eTs 6 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
Run Code Online (Sandbox Code Playgroud)

我想知道这个p->next->prev = p->prev;部分是否与说法相同,p = p->prev;因为下一个p的前一个是p本身.

提前感谢您的任何答案.

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

Cla*_*diu 8

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


Rem*_*eau 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;
}
Run Code Online (Sandbox Code Playgroud)

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