在C ++中插入尾部以获取链接列表无法正常工作

时间:2015-01-24 21:16:56

标签: c++ insert linked-list

这是我在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 ++指针的东西,我只是不理解?

4 个答案:

答案 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)

您在代码中定义了两个局部变量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);
}

答案 2 :(得分:0)

temp只存在于函数调用的范围内,因此当你在第一种情况下设置temp = nNode时,temp会在函数结束时被销毁。 root存在于函数调用之外,因此您需要设置root = nNode

答案 3 :(得分:0)

您应该将while(temp != NULL)更改为while(temp->next != NULL)temp = nNodetemp->next = nNode

或者for (temp = root; temp->next != NULL; temp = temp->next);就像转发指针一样。