双链表仅打印最后一个值

时间:2014-11-17 01:30:59

标签: c doubly-linked-list

我试图学习如何用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();

}

2 个答案:

答案 0 :(得分:1)

所以这里有一些错误。

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

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

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

novaLista-&gt; alocar = nome;

nomechar *alocarstruct 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;
}

如果你解决了所有这些问题,你的代码就会起作用。

关于缩进。这是真正的风格,但我更喜欢内核缩进样式:

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

答案 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指针