如何在c中删除链表中值为零的节点

How to delete Nodes in linked list with zero value in c

我正在使用 codeBlock,我正在尝试删除所有值为零的节点 起初我删除了头节点,直到头中没有零值 像这样

void exo6(Node* head)
{
    Node* p=(Node*)malloc(sizeof(Node));
    p=head;
    head=p;
    if(p->data==0)
    {
        while(p->data==0)
        {
            head=p->next;
            free(p);
            p=head;
        }
    }
    head=p;

然后我继续这样删除下一个节点

while(p!=null)
    {
        if(p->next->data==0)
        {
            Node* q=p->next;
            free(p->next);
            p->next=q->next;
        }else
            p=p->next;

    }
    printf("The NEw list is \n");
    display(head);

}

但代码仅适用于头节点

结果是这样的

最简单的方法是函数通过引用接受指向头节点的指针。

给你。

void exo6( Node **head )
{
    while ( *head != NULL )
    {
        if ( ( *head )->data == 0 )
        {
            Node *current = *head;
            *head = ( *head )->next;
            free( current );
        }
        else
        {
            head = &( *head )->next;
        }
    }
}

像这样调用函数

exo6( &head )l

至于你的函数实现则从内存泄漏开始

void exo6(Node* head)
{
    Node* p=(Node*)malloc(sizeof(Node));
    p=head;
    // ...

首先分配内存并将其地址存储在指针中p然后立即重新分配指针。还要考虑到通常当指向头节点的指针等于 NULL 时可以调用该函数。 此外,该函数按值接受指向头节点的指针。所以该函数处理原始指针的副本。更改副本不会影响原始指针。