插入到链表的尾部,C++无法正常工作



这是我在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;

末尾的赋值会影响实际节点,而不是指针。

在代码中定义两个局部变量,nNodetemp

由于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);就像转发你的指针。

相关内容

  • 没有找到相关文章

最新更新