Ir ao conteúdo
  • Cadastre-se

C Lista Encadeada - Erro na Listagem


ineedahelp

Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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