Ir ao conteúdo
  • Cadastre-se

C Problema na hora de imprimir uma lista encadeada


loukkanos

Posts recomendados

Estou criando a primeira lista encadeada, mas na hora de imprimir o conteudo da lista está imprimindo so o primeiro valor digitado, não estou conseguindo encontrar o erro, se puder me dar uma ajuda

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

typedef struct cadastro_produto{
    char nome[30];
    float preco_atacado;
    float preco_varejo;

    struct cadastro_produto *prox;
} produto;

int main (){

  setlocale (LC_ALL, "Portuguese");

  produto *ini, *fim;
  char resposta;

  ini = (produto *) malloc(sizeof(produto));

  if (ini == NULL) return 0;

  fim = ini;

  while (1){

    printf ("\nInforme o nome do produto: ");
    scanf ("%s", fim->nome);
    printf ("\nInforme o preço do produto no atacado: ");
    scanf ("%f", &fim->preco_atacado);

    printf ("\nInforme o preço do produto no varejo: ");
    scanf ("%f", &fim->preco_varejo);

    printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
    scanf ("%s", &resposta);

    while ((resposta != 'n') && (resposta != 'N') &&(resposta != 's') && (resposta != 'S')){
      printf ("\nValor informado invalido");
    printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
      scanf ("%s", &resposta);
    }

    if (resposta == 'N' || resposta == 'n') break;

    else /*(resposta == 'S' || resposta == 's')*/{
      fim -> prox = (produto *) malloc (sizeof(produto));
      if (fim -> prox == NULL) return 0;
      fim = fim -> prox;
    } 

  }
    fim -> prox = NULL;
    fim = ini;

    while (fim != NULL){
      printf ("\nProduto: %s", fim->nome);
      printf ("\nPreço no atacado: %.2f", fim->preco_atacado);
      printf ("\nPreço no varejo: %.2f\n\n", fim -> preco_varejo);

      fim = fim -> prox;
    }
    
  return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

fim -> prox = NULL;
    fim = ini;

    while (fim != NULL){
      printf ("\nProduto: %s", fim->nome);
      printf ("\nPreço no atacado: %.2f", fim->preco_atacado);
      printf ("\nPreço no varejo: %.2f\n\n", fim -> preco_varejo);

      fim = fim -> prox;
    }

 

Se na primeira linha aqui você escreve
 

    fim->prox = NULL


e na última do loop escreve
 

    fim = fim->prox

 

Não parece estranho que entre só uma vez no loop....

 

Ao terminar o tal loop fim vale fim->prox que ao iniciar vale... NULL

 

E a condicão de sair seria qual? Essa mesmo. Aí ele sai.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

"resposta" é do tipo char. você não pode ler %s caso contrário dará problema de segmentação de memória (você está escrevendo em partes da memória não alocadas e está bagunçando os ponteiros).

Perceba esse tipo de erro NÃO é alertado pelo compilador.

A solução é trocar por "%c", ou melhor ainda, adotar c++ ou outra linguagem mais moderna que tem ferramentas para prevenir esse tipo de coisa..

LEMBRANDO AINDA QUE você TEM QUE CHAMAR FREE PARA CADA MALLOC, C NÃO LIBERA A MEMÓRIA ALOCADA AUTOMATICAMENTE.

 

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

typedef struct cadastro_produto{
    char nome[30];
    float preco_atacado;
    float preco_varejo;

    struct cadastro_produto *prox;
} produto;

int main (){

  setlocale (LC_ALL, "Portuguese");

  produto *ini, *fim;
  char resposta;

  ini = (produto *) malloc(sizeof(produto));

  if (ini == NULL) return 0;

  fim = ini;

  while (1){

    printf ("\nInforme o nome do produto: ");
    scanf ("%s", fim->nome);
    printf ("\nInforme o preço do produto no atacado: ");
    scanf ("%f", &fim->preco_atacado);

    printf ("\nInforme o preço do produto no varejo: ");
    scanf ("%f", &fim->preco_varejo);

    printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
    scanf ("%c", &resposta);

    while ((resposta != 'n') && (resposta != 'N') &&(resposta != 's') && (resposta != 'S')){
      printf ("\nValor informado invalido");
    printf ("\nDeseja cadastrar outro produto? (s)im (n)ão: ");
      scanf ("%c", &resposta);
    }

    if (resposta == 'N' || resposta == 'n') break;

    else /*(resposta == 'S' || resposta == 's')*/{
      fim -> prox = (produto *) malloc (sizeof(produto));
      if (fim -> prox == NULL) return 0;
      fim = fim -> prox;
    } 

  }
    fim -> prox = NULL;
    fim = ini;

    while (fim != NULL){
      printf ("\nProduto: %s", fim->nome);
      printf ("\nPreço no atacado: %.2f", fim->preco_atacado);
      printf ("\nPreço no varejo: %.2f\n\n", fim -> preco_varejo);

      fim = fim -> prox;
    }
    
  return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...