【问题标题】:Why does my code not insert a new node into this linked list?为什么我的代码没有在这个链表中插入一个新节点?
【发布时间】:2019-07-18 15:39:06
【问题描述】:

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

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;
}

在第一个函数中没有包含新数据,我只得到原始链表。

但是第二个函数工作得很好。在链表的开头插入新节点时,双指针如何工作? (我已经看到了关于这个问题的答案,但我仍然很困惑)

【问题讨论】:

  • 退出每个循环时last的值是多少?
  • 第二个 append 函数在您的问题中无法编译,因为 last 没有在任何地方声明。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    为了更清楚,我们假设列表是空的。然后你必须改变这个双指针head_ref引用的指针。 你声明了一个新指针

    struct Node *last = *head_ref;
    

    循环

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

    被跳过,因为现在 last 已经等于 NULL die 到前面声明中的初始化。然后你改变了这个局部变量last

    last = new_node;
    

    head_ref指向的指针的原始值没有改变,因为last*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,则此循环将不起作用。

    【讨论】:

    • 感谢您的回答......我对您修改的代码有疑问......while ( *head_ref != NULL ) head_ref = &( *head_ref )->next;而不是这个,当我使用这个while ( *head_ref != NULL ) *head_ref = *head_ref ->next;时,我认为应该可以工作但没有......你能告诉我为什么第二个代码不起作用......
    • @RJRuhan 后缀运算符 -> 的优先级高于一元运算符 *。所以没有括号的表达式看起来像 *( head_ref->next )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多