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:  
ineedahelp

C Lista Encadeada - Erro na Listagem

Recommended Posts

Boa tarde! 
Minha lista só está exibindo todos os valores  quando coloco um elemento no início.  Tipo, se eu adicionar elementos só ao final dela e pedir pra exibir, eles não aparecem.
Alguém pode me dar uma ajuda?

 

#include<stdio.h>
#include<stdlib.h> 
  
typedef struct no
{
  	int info;
	struct no *prox; 
  	
}LISTA; 
  

LISTA *criarLista()
{
	return NULL; 
}
LISTA * inserirInicio(LISTA *lista, int num)
{
	LISTA *novo= (LISTA*) calloc(1,sizeof(LISTA)); 
	novo->info= num; 
	novo->prox=lista; 
	return novo; 
	
}

void inserirFinal(LISTA *lista, int num)
{
	LISTA *novo =(LISTA*) calloc(1,sizeof(LISTA)); 
	novo->info= num; 
	LISTA *aux= lista;
	LISTA *ant= NULL; 
		if(lista==NULL)
		{
			lista=novo; 
			
		}
		else
		{
			while(aux!=NULL)
			{
				ant=aux;
				aux=aux->prox; 
				 
			}
			  ant->prox= novo; 
			  
		}
		
	
} 

void imprime(LISTA *lista)
{
	LISTA *p;
	for(p=lista; p!=NULL; p=p->prox) 
	{
		printf(" %d\n", p->info); 
	}
}

void buscar(LISTA *lista, int valor)
{
	LISTA *p;
	for(p=lista;p!=NULL;p=p->prox)
	{
		if(valor==p->info)
		{
			
			printf("Valor %d encontrado!\n", valor); 
			
				
		}
	
	}
}

LISTA *retira(LISTA *lista, int valor)
{
	LISTA *p; 
	p=LISTA;
	LISTA *ant=NULL; 
	while((p!=NULL)&&(valor!=p->info))
	{
		ant=p; 
		p=p->prox;
	}
	if(p==NULL)
	{
		return LISTA; 
	}
	if (ant==NULL)
	{
		LISTA=p->prox; 
	}
	else
	{
		ant->prox=p->prox; 
		
	}
	free(p); 
	return LISTA; 
}


int main()
{

	LISTA *lista;
	LISTA *p;   
	int op; 
	int num;
	int pos; 
	int valor; 
	do
	{
		printf("\n\tMENU DE opções\n\n"); 
		printf("(1) Criar Lista\n"); 
		printf("(2) Inserir Início\n"); 
		printf("(3) Inserir Final\n"); 
		printf("(4) Imprimir Valores\n"); 
		printf("(5) Buscar Valor\n"); 
		printf("(6) Retirar valor\n"); 
		printf("(7) Sair\n"); 
		
		printf("ESCOLHA UMA OPCAO: "); 
		scanf("%d", &op); 
		
		switch(op)
		{
			case 1:
				
				lista=criarLista();
			 
				break; 	
			
			case 2:
				printf("Entre com o numero que deseja inserir: "); 
				scanf("%d", &num); 
				lista=inserirInicio( lista, num);
				
				break;
			
			case 3:
				printf("Entre com o numero que deseja inserir: "); 
				scanf("%d", &num); 
				 inserirFinal(lista, num);
			 	break;

				 
			case 4:
				
				imprime(lista); 
			
			 	break; 
				 
			case 5:
				printf("Entre com o valor que deseja buscar: "); 
				scanf("%d", &valor);
				buscar(lista, valor);
				break; 
				 
			case 6:
				printf("Entre com o valor que deseja retirar: "); 
				scanf("%d", &valor); 
				lista=retira(lista,  valor);
			 	break; 

			case 7:
			
			 	break; 
				 
			
			
		}
		
		
	}
	while(op!=7);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @ineedahelp.

 

1) CÓDIGO BASE

Seu código aqui nem está compilando (usando Dev++)... abaixo fiz algumas alterações e compilou, veja:

LISTA *retira(LISTA *lista, int valor)
{
	LISTA *p;
	//p=LISTA;
	p=lista;
	LISTA *ant=NULL;
	while((p!=NULL)&&(valor!=p->info))
	{
		ant=p;
		p=p->prox;
	}
	if(p==NULL)
	{
		//return LISTA;
		return lista;
	}
	if (ant==NULL)
	{
		//LISTA=p->prox;
		lista=p->prox;
	}
	else
	{
		ant->prox=p->prox;

	}
	free(p);
	//return LISTA;
	return lista;
}

Vou supor que você enviou o código errado. Se for outra coisa, favor tentar me explicar.

 

 

 

2) TIPOS DE PASSAGEM DE PARÂMETROS

Só para revisar: existe 2 tipos de passagens de parâmetros: ou por valor, ou por referência. Caso não saiba a diferença, favor dar uma pesquisada.

 

Então:

17 horas atrás, ineedahelp disse:

Minha lista só está exibindo todos os valores  quando coloco um elemento no início.  Tipo, se eu adicionar elementos só ao final dela e pedir pra exibir, eles não aparecem.

 

Pela que analisei, acontece que durante o inserirFinal() você está alterando um valor que veio por parâmetro, mas acontece que esse parâmetro está por valor, daí, ao terminar o procedimento, a variável original continuar com seu valor (perde as alterações que foram feitas no procedimento), veja:

 

17 horas atrás, ineedahelp disse:

void inserirFinal(LISTA *lista, int num)
{
	LISTA *novo =(LISTA*) calloc(1,sizeof(LISTA));
	novo->info= num;
	LISTA *aux= lista;
	LISTA *ant= NULL;
	if(lista==NULL)
	{
		lista=novo; //aqui você tenta alterar a variável "lista"
	}
	else
	{
		while(aux!=NULL)
		{
			ant=aux;
			aux=aux->prox;
		}
		  ant->prox= novo;
	}
}

 

 

Lá onde sinalizei, esta variável lista está sendo alterada, mas essa atribuição é perdida quando terminada o procedimento, pois esta está como "valor", em detrimento da "referência". (a lista dentro do procedimento é uma mera cópia do valor da variável lista que externa).

 

Para corrigir, apenas mude para referência, algo como:

void inserirFinal(LISTA *&lista, int num)

 

Testei aqui e funcionou.

 

 

 

3) OUTRAS ALTERAÇÕES

Tem outros pontos que precisam ser analisados... como:

  1. não deixar inserir sem ter "criado" a lista;
  2. no inserirFinal(), você não está atualizando o novo->info, creio que seja necessário;
  3. no inserirFinal(), a lista aux e ant deveria ficar dentro do else, já que só serão utilizando lá.
  4. no inserirInicio(), não precisa ter retorno, ou seja, transforma em void também e lá coloca lista=novo no lugar do return novo. (nesse caso precisando também mudar lista para referência, inserindo um &).

 

 

****

 

obs.: esses orientações são basicamente para o C++, não sei se tem diferença para o C (sou novo nesses mundos). Caso não funcione o inserirFinal() assim, terá que ver outras formas para corrigir, ou mesmo seguir a sugestão do @TYSQUARE89, onde retornaria lista e atualizaria lá fora... (lembrando que essa atualização só seria para o primeiro número). Resumindo: o problema está em atualizar a lista, ou você atualiza dentro da função ou atualiza fora (eu acho mais coerente atualizar dentro)

 

 

 

No aguardo.

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa@Simon Viegas ! Eu justamente copiei o código errado! :oops:
No que era pra ser o correto, só estava dando esse erro que falei mesmo. Mas com sua ajuda consegui consertar!
Muito obrigado. 

  • Curtir 1

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

×