удалить хвост не возвращает правильный список - PullRequest
1 голос
/ 06 июня 2019

У меня есть некоторые проблемы с функцией удаления хвоста, она не работает, когда я освобождаю текущий узел, но когда я работаю со следующим узлом, все работает нормально. Может кто-нибудь объяснить мне, что происходит и почему это не работает?

это список

    typedef struct node {
    int codice;
    struct node *next;
} nodo;

typedef nodo * lista;

функция удаления хвоста, которая не работает:

lista rimuovi_in_coda(lista l){
    if(l == NULL) return NULL;
    lista l_scorri = l;
    while(l_scorri->next != NULL)
        l_scorri = l_scorri->next;

    free(l_scorri);
    l_scorri = NULL;
    return l;
}

в этом списке список не изменен:

input: 0, 4
output: 0, 4

рабочий:

lista rimuovi_in_coda(lista l){
    if(l == NULL || l->next == NULL) {
        free(l);
        return NULL;
    }
    lista l_scorri = l;
    while(l_scorri->next->next != NULL)
        l_scorri = l_scorri->next;

    free(l_scorri->next);
    l_scorri->next = NULL;
    return l;
}

в этом списке возвращается, как и ожидалось

input: 0, 4
output: 0

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Вы никогда не будете сбрасывать какие-либо указатели или устанавливать «следующий» узел на NULL. Вы просто free элемент, но оставляете его в списке.

1 голос
/ 06 июня 2019

В первой функции вы изменяете локальную переменную l_scorri

free(l_scorri);
l_scorri = NULL;

Это не меняет значение элемента данных next предыдущего узла.

Inвторая программа, вы действительно изменяете элемент данных, следующий за предыдущим узлом.

l_scorri->next = NULL;

Функция может быть написана проще.Например

#include <stdio.h>
#include <stdlib.h>

typedef struct node 
{
    int codice;
    struct node *next;
} nodo;

typedef nodo * lista;

int rimuovi_in_coda( lista *l )
{
    int success = *l != NULL;

    if ( success )
    {
        while ( ( *l )->next != NULL ) l = &( *l )->next;

        free( *l );
        *l = NULL;
    }

    return success;
}

int main( void )
{
}
...