c - 链表帮助请求

标签 c

这是我的链表结构:

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/

相关文章:

c - 我如何在C中的这个函数中进行无限循环

c - -1 不小于 12?

c - 当两个结构相互包含时避免警告

c - FD_SET、FD_CLR ...是原子操作吗?

c - 用C语言开发网络层协议(protocol)

c - 是否可以保护c中的文件?

c++ - 从大型文本文件读取到 Qt 中的结构数组?

c - 删除一个字符并将其移动到一个字符串中

C - 字符数组的数组

c++ - 在 C++ 和 C 中的现有选项卡中打开 URL