这是我的链表结构:
typedef struct intervalo *Lista;
typedef struct intervalo
{
int num;
Lista next;
}Lista_int;
这是我的代码(我编写的)破坏列表的部分:
Lista destroi_lista_res(Lista lista)
{
Lista temp_ptr;
while (lista->next!= NULL)
{
temp_ptr = lista;
lista= lista->next;
free(temp_ptr);
}
free(lista);
return NULL;
}
不幸的是,调用此函数时我的程序挂起。具体来说,while (lista->next!= NULL)
永远不会终止。
我的问题:为什么这行会导致无限循环?
额外的代码细节:
在 main() 中,创建了两个列表。
/* Create linked list. */
Lista cria_lista_cab()
{
Lista aux;
aux=(Lista)malloc(sizeof(Lista_int));
if(aux!=NULL)
{
aux->next=NULL;
}
return aux;
}
以下函数用于将数字节点添加到两个列表的末尾:
/* Insert node at the list tail. */
void insere_elem(Lista *lista,int num)
{
Lista aux,ant_pos=*lista,pos=ant_pos->next;
aux=(Lista)malloc(sizeof(Lista_int));
while(pos!=NULL)
{
ant_pos=ant_pos->next;
pos=pos->next;
}
aux->num=num;
aux->next=pos;
ant_pos->next=aux;
}
下一个函数结合了两个列表的数字节点,以递增的数字顺序消除重复项。返回结果列表:
Lista cria_lista_una(Lista lista1,Lista lista2)
{
Lista lista_res=cria_lista_cab();
lista1=lista1->next;
lista2=lista2->next;
while(lista1!=NULL && lista2!=NULL)
{
if(lista1->num<lista2->num)
{
insere_elem(&lista_res,lista1->num);
printf("\n1 %d %d",lista1->num,lista2->num);
if(lista1!=NULL)
lista1=lista1->next;
}
else if(lista2->num<lista1->num)
{
insere_elem(&lista_res,lista2->num);
printf("\n2 %d %d",lista1->num,lista2->num);
if(lista2!=NULL)
lista2=lista2->next;
}
else if(lista2->num==lista1->num)
{
printf("\n3 %d %d",lista1->num,lista2->num);
if(lista1!=NULL)
lista1=lista1->next;
else if(lista2!=NULL)
lista2=lista2->next;
}
}
if(lista1!=NULL)
{
while(lista1!=NULL)
{
insere_elem(&lista_res,lista1->num);
lista1=lista1->next;
}
}
else if(lista2!=NULL)
{
while(lista2!=NULL)
{
insere_elem(&lista_res,lista2->num);
lista2=lista2->next;
}
}
return lista_res;
}
以下函数用于打印列表。
void imprime_lista_res(Lista lista)
{
lista=lista->next;
while(lista!=NULL)
{
printf("\nNum-> %d",lista->num);
lista=lista->next;
}
}
一切似乎都按预期运行,除了在调用 destroi_lista_res() 并且程序挂起时进行清理。 .
最佳答案
这可能是因为 lista
一开始是 NULL。
将函数更改为:
Lista destroi_lista_res(Lista lista)
{
Lista temp_ptr;
while (lista!= NULL)
{
temp_ptr = lista;
lista= lista->next;
free(temp_ptr);
}
return NULL;
}
关于c - 链表帮助请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24235990/