Ir ao conteúdo
  • Cadastre-se

C Problema com Lista ligada


Posts recomendados

Fala pessoal, tranquilo? Eu to estudando sobre a criação de listas simplesmente encadeadas com um nó cabeça, então decidi fazer um programa simples pra testar os conceitos. O problema é que depois de registrar a informação nos 'n' nós, quando eu coloco para exibir a lista só o ultimo nó aparece. Alguém poderia me ajudar? Agradeço desde já! (Qualquer crítica construtiva em relação ao código como identação, clareza, etc.. é muito bem vinda!)

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

typedef struct dados
{
    int idade;
    struct dados *prox;
}Dados;

void exibe_lista(Dados *lista);
void inicia_lista(Dados *lista);
void insere_final(Dados *lista, int value);

int main()
{
    int val_idade;
    int op; 
    Dados *head = (Dados *)malloc(sizeof(Dados));
    
    if(!head)
        exit(1);
    
    inicia_lista(head);
    
    do
    {
        printf("Entre a opcao 1 para inserir.\n");
        printf("Entre a opcao 2 para exibir.\n");
        scanf("%d", &op);
        printf("\n");
        
        switch(op)
        {                
            case 1:
                printf("Entre o valor da idade: ");
                scanf("%d", &val_idade);
                printf("\n");
                
                insere_final(head, val_idade);
                printf("No registrado\n");
            break;
            
            case 2:
                exibe_lista(head);
        }
    }while(op == 1 || op == 2);
    

}

void exibe_lista(Dados *lista)
{
    Dados *temp;
    
    temp = lista->prox;
    
    while( temp != NULL){
        printf("%5d", temp->idade);
        temp = temp->prox;
    }
    printf("\n");
        
}

void insere_final(Dados *lista, int valor)
{
    Dados *novo = (Dados *)malloc(sizeof(Dados));
            
    if(!novo)
        exit(1);
            
    if(lista->prox = NULL)
    {
        lista->prox = novo;
        novo->idade = valor;
        novo->prox = NULL;
    }
    else
    {
        Dados *tmp = (Dados *)malloc(sizeof(Dados));
        
        if(!tmp)
            exit(1);
        
        tmp->prox = lista;
        
        while(tmp->prox != NULL)
            tmp = tmp->prox;
        
        tmp->prox = novo;
        novo->idade = valor;
        novo->prox = NULL;
        
    }
}

void inicia_lista(Dados *lista)
{
    lista->prox = NULL;
}

 

Link para o comentário
Compartilhar em outros sites

50 minutos atrás, Cayo Eduardo Silveira disse:

Alguém poderia me ajudar?

O erro está nessa parte, você utilizou apenas um operador de igualdade, mas na condição são necessários dois " == "

if(lista->prox == NULL) //<<----------" == "
    {
        printf("Inseriu Final");
        lista->prox = novo;
        novo->idade = valor;
        novo->prox = NULL;
    }

 

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

  • Membro VIP

Olá @CiroboyBR.

 

56 minutos atrás, Cayo Eduardo Silveira disse:

(Qualquer crítica construtiva em relação ao código como identação, clareza, etc.. é muito bem vinda!)

 

De um modo geral, seria utilizar usar tabulação em vez de espaços. Basta selecionar o texto todo, pressionar "shift+tab" até encostar a esquerda, e reindentar com o tab (se selecionar mais de uma linha e dar tab, também indenta).

 

Outros pontos que gosto:

- A chave de abertura ("{") deixar logo após o comando, assim com dar um espaço, ex.:

typedef struct dados {
    int idade;
    struct dados *prox;
} Dados;

 

- As vezes é interessante dar alguns espaços para alinhar estruturas, ex.:

typedef struct dados {
    int    idade;
    struct dados *prox;
} Dados;

void exibe_lista (Dados *lista);
void inicia_lista(Dados *lista);
void insere_final(Dados *lista, int value);

- Prefiro dar um espaço após o if, while, do etc. Ex.:

	while (temp != NULL) {

 

- Acho interessante subir o else para o "}" do if, ex:

	if (lista->prox = NULL) {
		lista->prox = novo;
		novo->idade = valor;
		novo->prox  = NULL;
	} else {
		Dados *tmp = (Dados *)malloc(sizeof(Dados));
		if (!tmp)

- Em relação a pular linhas para separar estruturas, meio que depende... acho que não "tenho" uma regra específica para isso...

 

De uma modo geral, esse código ficaria assim:

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

typedef struct dados {
    int    idade;
    struct dados *prox;
} Dados;

void inicia_lista (Dados *lista);
void insere_final (Dados *lista, int value);
void exibe_lista  (Dados *lista);

int main() {
	int val_idade;
	int op;

	Dados *head = (Dados *)malloc(sizeof(Dados));
	if (!head)
		exit(1);
	inicia_lista(head);
	do {
		printf("Entre a opcao 1 para inserir.\n");
		printf("Entre a opcao 2 para exibir.\n");
		scanf("%d", &op);
		printf("\n");
		switch(op) {
			case 1:
				printf("Entre o valor da idade: ");
				scanf("%d", &val_idade);
				printf("\n");
				insere_final(head, val_idade);
				printf("No registrado\n");
				break;
			case 2:
				exibe_lista(head);
		}
	} while (op == 1 || op == 2);
}

void inicia_lista (Dados *lista) {
	lista->prox = NULL;
}

void insere_final (Dados *lista, int valor) {
	Dados *novo = (Dados *)malloc(sizeof(Dados));
	if (!novo)
		exit(1);
	//if (lista->prox = NULL) {
	if (lista->prox == NULL) {
		lista->prox = novo;
		novo->idade = valor;
		novo->prox  = NULL;
	} else {
		Dados *tmp = (Dados *)malloc(sizeof(Dados));
	    if (!tmp)
			exit(1);
		tmp->prox = lista;
		while (tmp->prox != NULL)
			tmp = tmp->prox;
		tmp->prox   = novo;
		novo->idade = valor;
		novo->prox  = NULL;
	}
}

void exibe_lista(Dados *lista) {
	Dados *temp;
	temp = lista->prox;
	while (temp != NULL) {
		printf("%5d", temp->idade);
		temp = temp->prox;
	}
	printf("\n");
}

 

PS: e no lugar de val_idade, usar idade mesmo. Não vejo necessidade dessa "val" antes.

 

Link para o comentário
Compartilhar em outros sites

17 minutos atrás, Simon Viegas disse:

De um modo geral, seria utilizar usar tabulação em vez de espaços.

Fala isso pro meu professor de Laboratório, Estruturas de dados, Análise de algoritmos e Autômatos

 

19 minutos atrás, Simon Viegas disse:

A chave de abertura ("{") deixar logo após o comando

Também concordo, o problema é que uso o plugin do codeblocks pra formatar o código.

 

21 minutos atrás, Simon Viegas disse:

As vezes é interessante dar alguns espaços para alinhar estruturas

O código não é meu e o plugin do CodeBlocks também não faz isso, talvez eu tenha que mexer um pouco mais nas configurações dele.

 

22 minutos atrás, Simon Viegas disse:

Prefiro dar um espaço após o if, while, do etc

Plugin do codeblocks não faz isso.

 

23 minutos atrás, Simon Viegas disse:

Acho interessante subir o else para o "}" do if

Também faço isso, mas sei que fica desalinhado com o primeiro if.


De modo geral gostei das dicas, e até acho interessante a criação de um tópico falando cobre indentação de código, pois é algo essencial, até pra achar os erros.

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

  • Membro VIP

Beleza cara...

 

Sobre:

4 horas atrás, CiroboyBR disse:

Fala isso pro meu professor de Laboratório, Estruturas de dados, Análise de algoritmos e Autômatos

Fiquei curioso... Tem algum motivo especial? não sou programador profissional, apenas um entusiasta, rs.


Então, eu sugeri a tabulação pois com ela o espaçamento pode ser feito de acordo com o gosto do programador, ou seja, dá (geralmente) para escolher quantos espaços quer que represente na visualização. Aqui no Dev++, o padrão fica com 4 "espaços" (visualmente substitui a tabulação por espaços), mas se eu mudar para qualquer outro, toda indentação seguirá a referência. Aqui no Dev++, o tab também fica por padrão para inserir tabulação (se demarcar o item, insere os 4, ou n, espaços).

 

Sobre essa orientação do professor... seria por uma questão técnica, algo como a codificação da tabulação impactar em algo ou tem algum outro motivo?

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