在 C++ 中插入链表的尾部无法正常工作
Insert to tail for linked list in C++ not working correctly
这是我在 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++ 中的指针,有什么我不理解的地方吗?
temp 只存在于函数调用的范围内,所以当你在第一种情况下设置 temp = nNode 时,temp 在函数结束时被销毁。 root 存在于函数调用之外,因此您需要设置 root= nNode
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);
}
您应该将 while(temp != NULL)
更改为 while(temp->next != NULL)
temp = nNode
到 temp->next = nNode
.
或者for (temp = root; temp->next != NULL; temp = temp->next);
就像转发你的指针。
这是我在 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++ 中的指针,有什么我不理解的地方吗?
temp 只存在于函数调用的范围内,所以当你在第一种情况下设置 temp = nNode 时,temp 在函数结束时被销毁。 root 存在于函数调用之外,因此您需要设置 root= nNode
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);
}
您应该将 while(temp != NULL)
更改为 while(temp->next != NULL)
temp = nNode
到 temp->next = nNode
.
或者for (temp = root; temp->next != NULL; temp = temp->next);
就像转发你的指针。