这是链接列表的结构:

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/

10-11 21:06