这是我在C++中对插入到尾部函数的实现:
void List::InsertBack(int x)
{
Node *temp = root;
Node *nNode = new Node(x);
if (temp == NULL)
{
temp = nNode;
}
else
{
while (temp != NULL)
{
temp = temp->next;
}
temp = nNode;
}
}
当我调用函数 list1 时。InsertBack(10),然后打印出它显示为空的链表。但是,如果我改变
if (temp == NULL)
{
temp = nNode;
}
自
if (temp == NULL)
{
root = nNode;
}
然后它可以正常工作并打印出 10 个就可以了。知道发生了什么吗?C++中的指针有什么我只是不理解的地方吗?
Node* temp = root;
在这里,您将创建root
指针的副本并使用 temp
初始化它。对temp
指针所做的更改根本不影响root
。因此,当您这样做时:
temp = nNode;
这只会更改局部变量temp
指向的内容,而不会更改root
本身指向的内容。修改root
的正确方法是分配给它本身:
root = nNode;
注意:如果temp
是对指针的引用,则代码将起作用。
接下来,当您附加到链表时,您必须找到next
等于 NULL
的最后一个节点。拥有该节点后,您需要更新其next
指针,因此正确的迭代方法是这样的:
while (temp->next)
temp = temp->next;
temp->next = nNode;
末尾的赋值会影响实际节点,而不是指针。
在代码中定义两个局部变量,nNode
和 temp
。
由于temp
是您唯一更改的内容,因此从来不是初始化它的成员(root
),因此难怪没有任何更改。
除了每次调用函数时都会产生内存泄漏。
将temp
更改为Node**
,并使用 root
地址(指向新节点的第一个候选位置)对其进行初始化:
void List::InsertBack(int x) {
Node **temp = &root;
while(*temp) // As long as we don't point to the null-pointer we want to replace
temp = &temp[0]->next; // move to the next node
*temp = new Node(x);
}
temp 只存在于函数调用的范围内,所以当你在第一种情况下设置 temp = nNode 时,temp 会在函数结束时被破坏。 root 存在于函数调用之外,因此您需要设置 root= nNode
您应该将while(temp != NULL)
更改为while(temp->next != NULL)
和temp = nNode
temp->next = nNode
.
或者for (temp = root; temp->next != NULL; temp = temp->next);
就像转发你的指针。