c - 释放节点使其值变为0。如何完全删除它?

标签 c data-structures singly-linked-list

我正在尝试实现一个单链表。刚刚创建了一个函数来删除列表中的最后一个节点,但由于某种原因,它将节点的值转换为 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,以便它成为最后一个元素。 如果您要从列表中删除唯一的元素,您还需要处理。

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

关于c - 释放节点使其值变为0。如何完全删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201208/

相关文章:

C OS X 将目录内容读入字符串数组

c - 很好的 C 库集合?

algorithm - 关于树数据结构的问题: How can we fill all inorder successor pointer of all tree nodes?

algorithm - 图实现、函数和参数。什么更有意义?

c++ - 指针牌组替换函数C++

c - 链接列表反向递归功能不起作用

python - 混合定义如何在枚举中工作?

C 编程。将字符串 www.as.com 转换为 3www2as3com0

haskell - 在 Haskell 中以通用方式扩充复杂数据类型

c++ - 重载的 + 和 - 运算符,无法弄清楚如何检查传入的 "amount"是否为负数