这是链接列表的结构:
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()和程序挂起时清除时,所有的功能似乎都按预期运行。
.
最佳答案
给定代码:
void insere_elem(Lista *lista,int num)
{
Lista aux,ant_pos=*lista,pos=ant_pos->next;
aux=(Lista)malloc(sizeof(Lista_int));
记住Lista实际上被定义为
指向结构Lista int实例的指针
你的代码变成:
注意:实际上是将节点附加到链接列表,而不是插入
void insere_elem(struct Lista_int* *lista,int num) //note the ptr to ptr
{
struct Lista_int * aux;
struct Lista_int * ant_pos=*lista; //gets ptr to first instance of struct Lista_int
struct Lista_int * pos=ant_pos->next; // get ptr to NULL or second instance of..
// get ptr to new instance of struct
aux=(struct Lista_int*)malloc(sizeof(Lista_int));
// HERE should be checking that malloc() was successful
// otherwise, the lines:
// aux->num=num;
// aux->next=pos;
// will be writing to offsets from address 0
// will probably cause a crash
// step forward through linked list to find last struct
while(pos!=NULL)
{
ant_pos=ant_pos->next; // step ptr to prior struct
pos=pos->next; // step ptr to current struct
}
aux->num=num; // set fields in new struct
aux->next=pos; // pos is already NULL, so probably (for clarity) just use NULL
ant_pos->next=aux; // set old struct instance ptr to new instance of struct
}
此外,关于本规范:
while(lista2!=NULL)
{
insere_elem(&lista_res,lista2->num);
lista2=lista2->next;
}
这个循环从链表lista res的开头开始
因此,对于当前链接列表中的每个元素,它都添加了另一个元素
一般来说,
这意味着链接列表的大小是此代码序列中每个条目的两倍
关于c - 要求的链表帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24235990/