为什么我的代码未在此链接列表中插入新节点?

时间:2019-07-18 15:39:06

标签: c linked-list append singly-linked-list

我是编程新手。我只想知道为什么这行不通。 我对指针的理解尚不清楚,尤其是在跨函数使用指针时。

void append(struct Node** head_ref, float new_data)
{

    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));

    struct Node *last = *head_ref;  /* used in step 5*/


    new_node->data  = new_data;
    new_node->next = NULL;

    while (last != NULL)
        last = last->next;


    last = new_node;
    return;
}

void append(struct Node** head_ref, float new_data)
{

while (last->next != NULL)
        last = last->next;


    last->next = new_node;
    return;
}

在第一个函数中,不包含新数据,我仅获得原始链接列表。

但是第二个功能可以正常工作。在链表的开头插入新节点时,双指针如何工作? (我已经看到有关此问题的答案,但我仍然感到困惑)

2 个答案:

答案 0 :(得分:3)

在第一个示例中,将指针last移动到指向NULL的位置。然后,将指针设置为new_node。但是,此时,last与您的链接列表没有真正的关联。它只是一些内存的指针。在第二个示例(正确的示例)中,您进行迭代直到到达链表的末尾,该节点的nextNULL。然后,将next设置为new_node。现在,列表中有了新的尾巴,即new_node

答案 1 :(得分:0)

更改局部变量last不会更改上一个(最后一个)节点的数据成员next的值。

更清楚地说,我们假设列表为空。然后,您必须更改此双指针head_ref引用的指针。 您声明了一个新指针

struct Node *last = *head_ref;

循环

while (last != NULL)
    last = last->next;

被跳过,因为现在已经倒数等于NULL死于前一个声明中的初始化。然后您更改了此局部变量last

last = new_node;

由于head_reflast占用不同的内存范围,因此*head_ref所指向的指针的原始值未更改。您更改了last占用的内存,但未更改head_ref占用的内存。

还应检查是否已成功分配内存。

该函数的外观如下

int append( struct Node **head_ref, float new_data )
{
    struct Node *new_node = malloc( sizeof( struct Node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data  = new_data;
        new_node->next  = NULL;

        while ( *head_ref != NULL ) head_ref = &( *head_ref )->next;

        *head_ref = new_node;
    }

    return success;
}

至于这个循环(我想你只是想展示循环而不是整个功能)

while (last->next != NULL)
        last = last->next;


    last->next = new_node;

然后您要更改上一个(最后一个)节点的数据成员next

尽管如果初始head_ref等于NULL,则此循环将不起作用。