使用以下结构体:
typedef struct lista {
int num;
struct lista * sig;
} nodo;
然后使用下面的函数来擦除由前面的struct节点形成的链表:
void eliminarListaEntera(nodo * registro) {
nodo * aux = NULL;
while(registro->sig != NULL){
aux=registro->sig;
printf("Borrando nodo de la listan");
free(registro);
registro=aux;
}
free(registro);
registro = NULL;
}
我看到的问题:如果我在调用eliminarListaEntera之前和之后在main()中运行以下代码:
printf("POINTER %pn", (void *) primerNodo);
得到相同的值。它不应该是0 (NULL)后调用删除函数?
如果我尝试再次遍历它,我只得到一个随机值,如-159426562,我猜这是因为它正在从内存中检索垃圾值。
当main
调用eliminarListaEntera(primerNodo)
时,传递primerNodo
的值。在eliminarListaEntera
内部,参数registro
是一个单独的对象,不以任何方式引用main
中的primerNodo
。
语句registro = NULL;
设置registro
为NULL
,对main
中的primerNodo
没有影响。
如果你想让一个被调用的函数影响调用方中的一个对象,你可以传递一个指向该对象的指针:
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 listan");
free(registro);
registro=aux;
}
free(registro);
*p = NULL; // Set the original pointer to NULL.
}
那么main
可以用eliminarListaEntera(&primerNodo);
调用这个例程。