这个擦除链表的函数是否正确?
Is this function to erase a linked list correct?
使用以下结构:
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 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
是一个单独的对象,不以任何方式引用 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 lista\n");
free(registro);
registro=aux;
}
free(registro);
*p = NULL; // Set the original pointer to NULL.
}
然后main
可以用eliminarListaEntera(&primerNodo);
调用这个例程。
使用以下结构:
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 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
是一个单独的对象,不以任何方式引用 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 lista\n");
free(registro);
registro=aux;
}
free(registro);
*p = NULL; // Set the original pointer to NULL.
}
然后main
可以用eliminarListaEntera(&primerNodo);
调用这个例程。