删除尾部不会返回正确的列表

时间:2019-06-06 14:38:31

标签: c list pointers singly-linked-list

删除尾部功能有一些问题,释放当前节点时不起作用,但是当使用下一个节点时,一切正常。有人可以向我解释发生了什么,为什么不起作用?

这是列表

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

在此列表中,列表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 个答案:

答案 0 :(得分:2)

您永远不会重置任何指针或将任何节点的“下一个”设置为NULL。您只需free个元素,但将其保留在列表中。

答案 1 :(得分:1)

在第一个函数中,您正在更改局部变量l_scorri

free(l_scorri);
l_scorri = NULL;

这不会更改前一节点的数据成员next的值。

在第二个程序中,您实际上是在更改上一个节点的下一个数据成员。

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 )
{
}