gpt4 book ai didi

c++链接列表不起作用

转载 作者:行者123 更新时间:2023-11-28 00:00:24 25 4
gpt4 key购买 nike

我正在尝试创建一个链表,但遇到了问题,因为我删除了我的节点两次。只有当一个节点被传递给一个函数时才会出现问题(如果它通过引用传递一切都很好)这让我相信被传递给函数的对象正在以指针指向节点的方式被复制来自原始列表而不是新列表。我试图通过重载 = 运算符来解决这个问题,但这也不起作用。对我做错了什么的解释会很棒。

感谢帮助

#include <iostream>

struct node{
node(int n){
if (n == 1){
data = 1;
next = NULL;
}
if (n == 2){
data = 2;
next = new node(1);
next -> next = NULL;
}
}
~node(){
std::cout << data << std::endl;
if (next != NULL) delete next;
}

void operator=(node a){
next = NULL;
}

int data;
node* next;
};

void func2(node v){
}


int main(){

node v(2);
if (v.next -> next == NULL) std::cout << "true\n";
func2(v);

return 0;
}

最佳答案

您的怀疑是正确的,但问题就出在这里;当您将节点传递到 func2 时,您只是复制了第一个节点,而不是整个列表。复制构造函数将复制第一个节点,以及第一个节点中的指针(指向原来的第二个节点),所以当 v 超出 func2 的范围时,它被删除一次,然后当它超出 main 的范围时再次被删除。您需要编写复制构造函数来执行“深复制”,遍历整个列表并将每个节点复制到新地址。

还请记住,在大多数情况下,复制构造函数应返回 *this,这在 C++ FAQ 和 Scott Meyers 的“Effective C++”一书中有所体现。因此签名应该是:

 node& operator=(const node& node);

如果您要重载赋值运算符,您可能还应该定义一个复制构造函数。顺便说一句,很好地解释了这个问题。

编辑:代码看起来像这样。很抱歉我没有测试过这个;我在我的平板电脑上编辑这个很痛苦......

#include <iostream>

struct node{
node(const node& toCopy) : data(toCopy.data)
{
if(toCopy.next != null) {
next = new node(toCopy);
}
}

node(int n){
if (n == 1){
data = 1;
next = NULL;
}
if (n == 2){
data = 2;
next = new node(1);
next -> next = NULL;
}
}

node& operator=(const node& toCopy) {
if(&toCopy != this) {
data = toCopy.data;

if(next != NULL) {
next = new node(toCopy);
}
}

return *this;
}

~node(){
std::cout << data << std::endl;
if (next != NULL) delete next;
}

int data;
node* next;
};

void func2(node v){
}


int main(){
node v(2);
if (v.next -> next == NULL) std::cout << "true\n";
func2(v);

return 0;
}

关于c++链接列表不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com