gpt4 book ai didi

c - 双链表仅打印最后一个值

转载 作者:行者123 更新时间:2023-11-30 15:27:28 25 4
gpt4 key购买 nike

我正在尝试学习如何用 C 语言编程,但我遇到了双链表问题。如果您测试我的代码,您将看到 2 个错误。

1 - 我收到警告“来自不兼容指针类型的分配”。我看到了好几个这样的问题,我的英语不是最好的,所以我正在翻译它=)。

但是,即使出现此错误,程序仍会编译并执行。是什么让我想到了第二个问题:

2 - 我在列表中插入姓名,但是当我打印列表时,仅打印插入的姓氏,其数量与我包含的姓名数量相同。

例如:

输入:Peter、Ryan、Paul:

输出:保罗 保罗 保罗

我的代码:

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

//Estrutura Lista
struct lista
{
struct lista* alocar;
struct lista* ant;
struct lista* prox;
}; typedef struct lista Lista;



Lista* inicia (void)
{
return NULL;
}


Lista* lst_nomes (Lista* lst, char nome[50])
{
Lista* novaLista = (Lista*)malloc(sizeof(Lista));
novaLista->alocar = nome;
novaLista->prox = lst;
novaLista->ant = NULL;

if(lst != NULL)
{
lst->ant = novaLista;
}
return novaLista;
}



void mostraLista (Lista* lst)
{

Lista* x;

for (x = lst; x != NULL; x = x->prox)
{
printf("Lista = %s\n", x->alocar);

}
}


main()
{
Lista* lst;
char pegaTeclado[50];
int imprimeLista;
int resp;

lst = inicia();

do{
printf("Entre com o nome a ser gravado\n");
gets(pegaTeclado);
lst = lst_nomes(lst, pegaTeclado);
fflush(stdin);

printf("\nDeseja inserir mais algum nome?\n 1 p/ Sim\n");
scanf("%d", &resp);
fflush(stdin);

} while (resp ==1);



printf("\nDeseja imprimir a lista de nomes?\n Sim = 1\n\nOu digite outra tecla para sair\n\n");
scanf("%d", &imprimeLista);

if(imprimeLista == 1)
{
mostraLista(lst);
}

getch();

}

最佳答案

所以这里有一些问题。

第一件事是您使用getch()函数来阻止直到输入,这是可以完成的,但它是ncurses库的一部分,您需要正确初始化它。

第二件事是使用 gets() 这是不安全的,应该使用不同的方法。 getc() 直到找到新行或 scanf()fgets()

第三件事是两种指针类型不匹配:

novaLista->alocar = nome;

nomechar *,但 alocarstruct lista*

下一步是转换 malloc() 的返回值,这并不是严格错误的,但可能会隐藏一些错误,因此您不应该这样做。

那么你不应该在 stdin 上调用 fflush()

最后一件事是您必须将 main() 定义为 int 函数。

现在找到问题的根源:

首先,您有一个字符数组,用于存储输入。它每次都打印出最后输入的字符串的原因是因为您覆盖了旧的字符串。

您在链接列表中定义了一个指针,这意味着它指向内存块。在您的情况下,内存包含您从标准输入捕获的字符串。当您获取下一个字符串时,相同的内存将被覆盖。要解决此问题,您必须将字符串从 nome 复制到驻留在链接列表中的 char 数组中。

复制必须在数组上完成。您必须为字符串分配内存,然后使用 strcpy()

复制它
Lista* lst_nomes (Lista* lst, char nome[50]) {
Lista* novaLista = malloc(sizeof(Lista));
novaLista->alocar = malloc(strlen(nome) + 1);
strcpy(novaLista->alocar, nome); // copy the string
novaLista->prox = lst;
novaLista->ant = NULL;

if(lst != NULL)
{
lst->ant = novaLista;
}
return novaLista;
}

如果你解决了所有这些问题,你的代码就可以工作。

关于缩进。这确实是风格,但我更喜欢内核缩进风格:

https://www.kernel.org/doc/Documentation/CodingStyle

关于c - 双链表仅打印最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com