我想用指针创建一个链表。因此,我创建了一个带有指针和值的结构,该指针是指向列表的下一个节点的指针。
当我尝试为下一个节点设置Poniter时,我想通过从第一个节点指向它来更改下一个节点的值,但是当我尝试通过直接从节点结构访问来显示值时,我得到另一个结果,我该如何使它们相等?这样,如果我更改一个,无论从何处更改,节点的值都将更改。
这是针对大学项目的,我们需要使用链接列表。我只是开始学习指针主题,因此我会接受任何帮助。
#include <iostream>
struct node
{
double val;
node *nxt;
};
int main()
{
node n1, n2;
n1.val = 10;
n1.nxt = new node{n2};
n1.nxt->val = 20;
std::cout << "List:\n";
std::cout << n1.val << "\n"
<< n2.val << "\n";
}
实际结果:
列表:
10
1.39065e-309
预期结果:
列表:
10
20
答案 0 :(得分:0)
更改此行:
n1.nxt = new node{n2};
到
n1.nxt = &n2;
之所以无法执行,是因为您正在使用 n2
创建 new node{n2}
的副本(因为C ++定义了implicit copy constructor替换为class),因此正是该副本的 val
更改为 20 。
通过使用 [1] 操作符( &
)的地址,您可以将指针分配给 n2
,因此可以使用 n1.nxt->val = 20
更改其值。
答案 1 :(得分:0)
那是因为您实际上是在分配一个新的node
,而不是实际上将您的nxt
链接设置为保留实际的n2
节点。
如果希望将此节点添加到链接列表,则应使用(&
)运算符的地址:
n1.nxt = &n2;
请记住,不建议您以这种方式创建链接列表,特别是如果您在诸如addNode()
之类的辅助函数中执行此操作,因为一旦功能退出,n2
将被销毁。因此,通常最好使用new
或类似的方法。看起来像这样:
n1.nxt = new node(/* node constructor parameters */);
或者,如果您要复制现有的node
:
n1.nxt = new node{n2};