【问题标题】:delete tail doesn't return the correct list删除尾巴不返回正确的列表
【发布时间】:2019-10-22 02:34:44
【问题描述】:

我在使用 delete tail 功能时遇到了一些问题,当我释放当前节点时它不起作用,但是当我使用下一个节点时一切正常。有人可以向我解释发生了什么以及为什么它不起作用吗?

这是列表

    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

【问题讨论】:

    标签: c list pointers singly-linked-list


    【解决方案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 )
    {
    }
    

    【讨论】:

    • 因此 l_scorri = NULL 我只是在改变 l_scorri 将指向的位置,但在 l_scorri->next = NULL 我正在改变 l_scorri->next IS 指向的值?
    • @MarcoA7 l_scorri = NULL 改变变量 l_scorri 本身的值。
    【解决方案2】:

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

    【讨论】:

    • 但是释放当前节点而不是节点的下一个节点有什么区别
    • 区别不在于释放,而是将指针设置为NULL。在您的第一个版本中,您只需将 NULL 分配给指针的本地副本。与列表无关。
    • 如果 l_scorri 与 l 没有关系,则 l_scorri->next 与 l 有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多