c - 这个删除链表的功能是否正确?
问题描述
使用以下结构:
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 这样的随机值,我猜这是因为它正在从内存中检索垃圾值。
解决方案
main
调用时eliminarListaEntera(primerNodo)
,它传递 的值primerNodo
。在内部eliminarListaEntera
,参数registro
是一个单独的对象,不以任何方式引用primerNodo
in main
。
该语句registro = NULL;
设置registro
为inNULL
并且对primerNodo
in没有影响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);
。
推荐阅读
- junit5 - 如何检测丢失的@Nested 注释?
- php - foreach 中 Laravel 5 删除按钮的问题?
- python - 如何在没有任何 ID 的表中选中此复选框
- visual-studio-2017 - VS 2017 Query Builder - 使用“where in”更新查询
- composer-php - 作曲家不承认分叉回购包括
- python - 我有一个数字列表,我想知道某个数字之后出现的第一个数字
- reactjs - 如何从reducer中的数组中删除特定对象
- spring-boot - 根据jpa中的两个外国ID获取行
- c# - 带有 CMake 的 C# - 添加服务引用(wsdl 文件)
- node.js - 集成 Skype 和 facebook Messenger 没有用fulfillmenttext 响应