Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链表删除函数的单指针//是否可能_C++_Pointers_Linked List - Fatal编程技术网

C++ 链表删除函数的单指针//是否可能

C++ 链表删除函数的单指针//是否可能,c++,pointers,linked-list,C++,Pointers,Linked List,目前,我正在研究链表结构 当我搜索时,使用双指针的链表删除功能 在下面的代码中,通过delete函数中的双指针成功删除了节点 #包括 使用名称空间std; 结构节点 { int数据; 节点*下一步; }; 类链接列表 { 私人: 节点*头; 节点*尾部; 公众: LinkedList() { 水头=零PTR; tail=nullptr; } void add_节点(int n) { node*temp=新节点; 温度->数据=n; temp->next=nullptr; if(head==nul

目前,我正在研究链表结构

当我搜索时,使用双指针的链表删除功能
在下面的代码中,通过delete函数中的双指针成功删除了节点

#包括
使用名称空间std;
结构节点
{
int数据;
节点*下一步;
};
类链接列表
{
私人:
节点*头;
节点*尾部;
公众:
LinkedList()
{
水头=零PTR;
tail=nullptr;
}
void add_节点(int n)
{
node*temp=新节点;
温度->数据=n;
temp->next=nullptr;
if(head==nullptr)
{
压头=温度;
尾=温度;
}
其他的
{
尾部->下一步=温度;
tail=tail->next;
}
}
节点*gethead()
{
回流头;
}
无效显示(节点*头部)
{
if(head==nullptr)
{
下一步;
如果(*nd)
{
节点*temp=*nd;
*nd=(*nd)->下一步;
删除临时文件;
}
其他的
{
cout next=温度;
tail=tail->next;
}
}
节点*gethead()
{
回流头;
}
无效显示(节点*头部)
{
if(head==nullptr)
{
下一步;
如果(pp)
{
节点*temp=pp;
pp=pp->next;
删除临时文件;
}
其他的
{
cout首先,术语是“指向指针的指针”,而不是“双指针”。双指针是指向类型为
double
的变量的指针

您应该真正意识到指针只是内存中的地址。 复制指针时(即:
node*pp=head;
),将head指向的地址放入pp中。 这意味着什么?pp和head都指向同一个地址

但是,同样重要的是要记住pp和head是变量,因此也会被写入内存中。如果说-pp和head也有地址,但是由于pp和head是不同的变量,它们有不同的地址

因此,当您试图修改head的内容时,问题就出现了

第一次出现时:

节点**nd=&head;
而(*nd&&(*nd)->数据!=值)
nd=&(*nd)->下一步;
您根本不需要修改head(或
*nd
)的内容。因此,您可以将该版本与pp一起使用

您的问题在于这段代码:

pp=pp->next;
在这里,pp是原始链接列表项地址的副本,因为它只是一个副本,所以
pp=pp->next
实际上什么都不做。在这种情况下,您确实应该编写
*nd=*nd->next
,因为这样会更改原始值,而不是您创建的副本


注意:即使您在第二个示例中将变量
pp
更改为指向指针的指针,您的代码仍然无法删除列表中的第一个元素,因为它是作为指向head的常规指针传递的,因此只有您的第一个版本是有效的。

通过简化,您的字面意思是从代码中删除一个“*”吗?pp和temp指向您删除的同一个节点。您需要修改上一个节点的下一个指针(如果在开头,则修改头)。解释“不工作”。你为什么认为它不起作用?它是怎么起作用的。它的行为与你预期的不同吗?你预期的是什么?@sweenish是的,我的意图是使用一个“*”作为删除函数。我理解你的解释。非常感谢你提供的详细信息。正如你提到的,在第二个代码中,
pp=pp->next
Doespract我什么都没有。谢谢你。而且
delete temp
不会删除我期望的节点,而是删除pp(它只保存节点的地址)。谢谢。