我正在尝试使用c++实现一个简单的链表。我可能在某个地方犯了一个愚蠢的错误。通过这个,我想学习C++中的类和指针。对于代码
#include <iostream>
using namespace std;
class node
{
public:
node* next;
int data;
node(int d);
void append(int d);
};
node::node(int d)
{
data = d;
next = NULL;
}
void node::append(int d)
{
node nw = node(d);
if(next==NULL)
next = &nw;
else
{
node *n = next;
while((*n).next!=NULL)
{
n = (*n).next;
}
(*n).next = &nw;
}
}
我得到81作为1旁边的节点。
int main()
{
node n = node(1);
n.append(3);
n.append(2);
n.append(81);
n = *(n.next);
cout<< n.data << 'n';
}
请帮我弄清楚我哪里搞错了。
可能还有其他错误,但这是非常危险的:您正在创建一个局部变量来表示新节点:node nw = node(d);
,然后使列表中的最后一个节点指向nw
。但是,由于nw
是一个局部变量,当函数返回时,它将不存在。因此,最后一个节点的next
指针现在指向已经不存在的东西。您需要使用new node(d)
(返回指向node
的指针)来创建一个在函数返回后将继续存在的对象。
您的错误是在堆栈上创建一个对象,然后存储指向它的指针。堆栈被覆盖,对象被覆盖,指针无效。
在您的情况下,保存3的节点最终会被保存81的节点覆盖。
我是否还建议您将LinkedList类与Node类分开?然后,您可以将append()方法移动到该类中,并让它管理您的节点。
void node::append(int d) {
node *nw = new node(d);
node *last = this;
while((*last).next!=NULL)
last = (*last).next;
(*last).next = nw;
}
是的,如果您的对象打算在函数完成后保留,那么您应该在堆(new关键字)上创建它们,而不是在堆栈上。
通过使用
node *nw=new node(d);
每次都将指针指向相同的位置,这会导致数据的重写。因此,即使使用新的,输出也是81
找到一种方法来创建一个指向不同内存地址的新节点
我的评论被屏蔽了,所以我写了这是答案很抱歉给带来不便