-3

所以,伙计们,我试图在 C 中实现一个链表算法,这是代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct lista{
int info;
struct lista *next;
} *aplinked, strulinked;

aplinked insereNoFim(aplinked inicio, aplinked novo)
{
aplinked temp;
if (inicio == NULL)
    inicio = novo;
else{
    temp = inicio;
    while (temp->next != NULL)
        temp=temp->next;
    temp->next = novo;
}
return inicio;

}

aplinked lenovo()
{
aplinked x;
x = (aplinked) malloc (sizeof(strulinked));
scanf ("%d", &x->info);
return x;
}

void exibe(aplinked inicio){
aplinked temp = inicio;
if (temp == NULL)
printf ("Não existe dados");
else
while (temp!=NULL){
printf ("\n info: %d \n", temp->info);
temp = temp->next;
}
}


aplinked remover(aplinked inicio, int x)
{
aplinked ant = NULL;
aplinked temp = inicio;
//procura o elemento na lista, guardando o anterior.
while (temp!=NULL && temp->info != x){
        ant = temp;
        temp = temp->next;
}
//verifica se achou
if (temp == NULL)
    return inicio; //no caso de não achar
if (ant == NULL)
    inicio = temp->next; //retirar o 1o elemento
else
    ant->next = temp->next;
free (temp);
return inicio;
}



int pesquisa (aplinked inicio, int x){
aplinked temp = inicio;
while (temp!=NULL){
    if (temp->info == x)
        return 1;
    temp = temp->next;
    }
return 0;
}

int main ()
{
int cont = 1;
aplinked inicio = NULL;
while (cont){
inicio = insereNoFim(inicio, lenovo());
scanf ("%d", &cont);
}
exibe(inicio);
printf ("Digite numero a ser pesquisado: \n");
scanf ("%d", &cont);
if (pesquisa (inicio, cont))
    printf ("achou o elemento buscado \n");
else
    printf ("não achou");

printf ("Digite elemento a ser removido: \n");
scanf ("%d", &cont);
inicio = remover (inicio, cont);
exibe (inicio);
}

是的,代码不是英文的,但你可能知道它是关于什么的,所以,一个链表,删除/插入/搜索/打印功能,在 linux 上运行良好,但在 windows 上运行不正常! !

有任何想法吗?

4

2 回答 2

2

我强烈建议您学习如何使用调试器。这是你的问题:

aplinked temp;
if (inicio == NULL)
    inicio = novo;
else{
    temp = inicio;
    while (temp->next != NULL)  //  you never set this to NULL
        temp=temp->next;

因为你从来没有明确设置temp->nextNULL可能有任何东西。显然在Linux上它是NULL(你很幸运)而在Windows上它只是垃圾......junk != NULL所以它试图设置和取消引用它然后你崩溃了。

您应该在函数中填写结构的所有元素lenovo(),而不仅仅是info

于 2013-04-11T18:26:58.200 回答
1

当你分配一个新节点时,你不会初始化它的next指针。这意味着它将指向一个看似随机的位置,并且当您尝试查找列表的末尾时,它将继续在实际末尾循环。

于 2013-04-11T18:26:28.040 回答