我试图学习如何用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();
}
答案 0 :(得分:1)
所以这里有一些错误。
首先,您使用getch()
函数来阻止直到输入,这可以完成,但它是ncurses
库的一部分,您需要正确初始化它。
第二件事是使用gets()
这是不安全的,应该采用不同的方法。 getc()
直到找到新行或scanf()
或fgets()
。
第三件事是两种指针类型不匹配:
novaLista-&gt; alocar = nome;
nome
是char *
但alocar
是struct lista*
。
接下来就是你转换malloc()
的返回值这不是严格错误但可以隐藏一些错误,所以你不应该这样做。
然后你不应该在fflush()
上致电stdin
。
最后一件事是你必须将main()
定义为int函数。
现在问题的根源是:
首先,您有一个char数组,用于存储输入。它每次打印出最后输入的字符串的原因是因为你覆盖旧的字符串。
您已在链表中定义了一个指针,这意味着它指向一个块内存。在你的情况下,包含从stdin捕获的字符串的内存。获得下一个字符串时被覆盖的内存相同。要解决此问题,您必须将nome
中的字符串复制到驻留在链接列表中的字符数组中。
必须在阵列上进行复制。你必须为字符串分配内存,然后用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;
}
如果你解决了所有这些问题,你的代码就会起作用。
关于缩进。这是真正的风格,但我更喜欢内核缩进样式:
答案 1 :(得分:0)
在你的功能中
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; }
您指向一个指向字符指针的结构指针。尝试制作&#34; alocar&#34;结构定义中的char指针