这是我在C ++中使用insert to tail函数的实现:
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 ++指针的东西,我只是不理解?
答案 0 :(得分:1)
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;
最后的赋值会影响实际节点,而不是指针。
答案 1 :(得分:1)
您在代码中定义了两个局部变量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);
}
答案 2 :(得分:0)
temp只存在于函数调用的范围内,因此当你在第一种情况下设置temp = nNode时,temp会在函数结束时被销毁。 root存在于函数调用之外,因此您需要设置root = nNode
答案 3 :(得分:0)
您应该将while(temp != NULL)
更改为while(temp->next != NULL)
和temp = nNode
到temp->next = nNode
。
或者for (temp = root; temp->next != NULL; temp = temp->next);
就像转发指针一样。