首页 > 解决方案 > 这个删除链表的功能是否正确?

问题描述

使用以下结构:

typedef struct lista {
    int num;
    struct lista * sig;
} nodo;

然后我们有以下函数来擦除由先前结构节点形成的链表:

void eliminarListaEntera(nodo * registro) {
    nodo * aux = NULL;
    
    while(registro->sig != NULL){
        aux=registro->sig;
        printf("Borrando nodo de la lista\n");
        free(registro);
        registro=aux;
    }
    free(registro);
    registro = NULL;
}

我看到的问题:如果我在调用 eliminarListaEntera 之前和之后在 main() 中运行以下内容:

printf("POINTER %p\n", (void *) primerNodo);

我得到相同的值。调用delete函数后不应该是0(NULL)吗?

如果我再次尝试遍历它,我只会得到一个像 -159426562 这样的随机值,我猜这是因为它正在从内存中检索垃圾值。

标签: cpointerslinked-list

解决方案


main调用时eliminarListaEntera(primerNodo),它传递 的值primerNodo。在内部eliminarListaEntera,参数registro是一个单独的对象,不以任何方式引用primerNodoin main

该语句registro = NULL;设置registro为inNULL并且对primerNodoin没有影响main

如果你想让一个被调用的函数影响调用者中的一个对象,你可以传递一个指向该对象的指针:

void eliminarListaEntera(nodo **p) {
    nodo *registro = *p;  // Copy the original pointer for ease of use.
    nodo * aux = NULL;
    
    while(registro->sig != NULL){
        aux=registro->sig;
        printf("Borrando nodo de la lista\n");
        free(registro);
        registro=aux;
    }
    free(registro);
    *p = NULL;  // Set the original pointer to NULL.
}

然后main可以用 调用这个例程eliminarListaEntera(&primerNodo);


推荐阅读