Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Cayo Eduardo Silveira

C Problema com Lista ligada

Recommended Posts

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

 

Editado por Simon Viegas
Olá! Favor ler tópico e seguir orientações sobre POSTAGEM DE CÓDIGOS: http://www.clubedohardware.com.br/announcement/27-poste-seus-c%C3%B3digos-corretamente/

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Cayo Eduardo Silveira disse:

Nossa, fiquei tanto tempo quebrando a cabeça por causa de um '=', brigadão

Talvez seja hora de fazer uma pausa ara o lanche e descansar a vista.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×