Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

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
Postado
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
Postado

"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;
}

 

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...