我正在为我的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:修正了拼写错误并添加了一些代码以使其更清晰.
不完全的.p是一个局部变量.p->next->prev是一个实例变量p->next.改变前者不会影响结构,而改变后者则会.换句话说,它们的值可能相同,但存储这些值的存储器地址是不同的.
我想知道这
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容器而不是手动实现.