【问题标题】:Freeing node renders its value to 0. How to delete it completely?释放节点将其值呈现为0。如何完全删除它?
【发布时间】:2018-01-11 06:44:23
【问题描述】:

我正在尝试实现一个单链表。刚刚创建了一个删除列表中最后一个节点的函数,但由于某种原因,它将节点的值转换为0,但并没有完全删除它。

函数本身:

void deleteNodeEnd(node_t **head) {
    node_t *current = *head;

    while(current->next != NULL) {
        current = current->next;
    }

    free(current);
}

我怎么称呼它:

deleteNodeEnd(&head);

我之前在列表中添加了 3 个值为 {10, 1, 2} 的节点,这是调用 deleteNodeEnd(&head) 然后打印出列表后得到的结果:

$ ./linkedlist
10
1
0

所以最终我的意图是完全删除值为2 的节点,而它只是变成0。您能否给我一个提示,我可能在哪里犯了错误?

【问题讨论】:

  • 你可能想在删除最后一个元素后用 NULL 终止你的列表,不是吗?
  • 其实没有,我这里添加的时候代码有误,后来又编辑了。也许你看到了最初的版本?
  • 我看到了两个版本。我的评论仍然成立。当您释放指针时,访问它会变成未定义的行为,因此您会看到 0。不能依赖该 0。
  • 您的评论帮了大忙,有了下面的答案,我完全明白了!谢谢!

标签: c data-structures singly-linked-list


【解决方案1】:

您需要使倒数第二个元素指向null,使其成为最后一个元素。 如果您要从列表中删除唯一的元素,您还需要处理。

void deleteNodeEnd(node_t **head) 
{
    node_t *current = *head;
    if(current->next == NULL)
    {
        *head = NULL;
        free(current);
        return;
    }
    while(current->next->next != NULL) 
    {
        current = current->next;
    }

    free(current->next);
    current->next = NULL;
}

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多