Как удалить узлы в связанном списке с нулевым значением в c - PullRequest
0 голосов
/ 01 апреля 2020

Я использую 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);

}

, но код работал только на головных узлах

результат выглядит так the final result of code

1 Ответ

1 голос
/ 01 апреля 2020

Самый простой способ - это когда функция принимает указатель на головной узел по ссылке.

Вот вам.

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. Более того, функция принимает указатель на головной узел по значению. Таким образом, функция имеет дело с копией исходного указателя. Изменение копии не влияет на исходный указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...