Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Edultra

[Resolvido] Lista Encadeada

Recommended Posts

Bem pessoal estou tendo o seguinte problema, ao tentar excluir o ultimo valor digitado na lista encadeada ele da pau no programa aparecendo uma listagem infinita ou zero, quando utiliza-se o apagar lista e pede-se para listar apare-se alguns falores, vou passar primeiro os local onde é feita a exclusão pois acho que lá esta o problema:

 

Lista* retira(Lista* l, int v)
{
	   Lista* ant = NULL; // ponteiro para elemento anterior
	   Lista* p = l; // ponteiro para percorrer a lista
	   // procura elemento na lista, guardando anterior
	   while (p != NULL && p->valor != v)
	   {
			 ant = p;
			 p = p->prox;
	   }
	   // verifica se achou elemento
	   if (p == NULL)
	   {
			return l; // não achou: retorna lista original
	   }
	   // retira elemento
	   if (ant == NULL) 
	   {
			 // retira elemento do inicio
			 l = p->prox;
	   }
	   else
	   {
			// retira elemento do meio da lista
			ant->prox = p->prox;
	   }
	   free(p);
	   return l;
}

 

Segue o codigo inteiro para a compilação de quem desejar:

 

#include <iostream>
#include <conio.h>
using namespace std;
struct lista {
int valor;
struct lista* prox;
};
typedef struct lista Lista;

/* função de inicialização: retorna uma lista vazia */
Lista* inicializa (void)
{
return NULL;
}

/* inserção no início: retorna a lista atualizada */
Lista* insere (Lista* l, int i)
{
Lista* novo = (Lista*) malloc(sizeof(Lista));
novo->valor = i;
novo->prox = l;
return novo;
}
/* função imprime: imprime valores dos elementos */
void imprime (Lista* l)
{
	 Lista* p; /* variável auxiliar para percorrer a lista */
	 for (p = l; p != NULL; p = p->prox)
		 printf("valor = %d\n", p->valor);
		 getch();
}

// função retira: retira elemento da lista 
Lista* retira(Lista* l, int v)
{
	   Lista* ant = NULL; // ponteiro para elemento anterior
	   Lista* p = l; // ponteiro para percorrer a lista
	   // procura elemento na lista, guardando anterior
	   while (p != NULL && p->valor != v)
	   {
			 ant = p;
			 p = p->prox;
	   }
	   // verifica se achou elemento
	   if (p == NULL)
	   {
	   return l; // não achou: retorna lista original
	   }
	   // retira elemento
	   if (ant == NULL) 
	   {
			 // retira elemento do inicio
			 l = p->prox;
	   }
	   else
	   {
			// retira elemento do meio da lista
			ant->prox = p->prox;
	   }
	   free(p);
	   return l;
}
void libera (Lista* l)
{
	   Lista* p = l;
	   while (p != NULL) 
	   {
			 Lista* t = p->prox; //guarda referência para o próximo elemento
			 free(p); /* libera a memória apontada por p */
			 p = t; /* faz p apontar para o próximo */
	   }
}
int main (void)
{
	 char opcao;
	int valor,v;
	Lista* l; // declara uma lista não inicializada
	l = inicializa(); // inicializa lista como vazia

   while(opcao!=53)
   {
	do{
	  system("cls");
	  cout<<"*********************************"<<endl;
	  cout<<"*			Menu			   *"<<endl;
	  cout<<"*		 1 Incluir			 *"<<endl;
	  cout<<"*		 2 Excluir			 *"<<endl;
	  cout<<"*		 3 Lista			   *"<<endl;
	  cout<<"*		 4 Apagar lista		*"<<endl;
	  cout<<"*		 5 Sair				*"<<endl;
	  cout<<"*********************************"<<endl;
	  cin>>opcao;
	  
	}while(opcao<49||opcao>52);
	  if(opcao==49)
	  {
		cout<<"Digite o valor: ";
		cin>>valor;
		l = insere(l,valor); // insere na lista o valor digitado   
	  }  
	  else if(opcao==50)
	  {
		cout<<"Digite o valor a ser retirado :"<<endl;
		cin>>v;
		retira(l,v); // retira da lista o valor digitado   
	  }
	  else if(opcao==51)
	  {
		imprime(l);
	  }
	  else if(opcao==52)
	  {
		libera(l);		
	  }  
		
   }   
return 0;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

edultra to meio sem tempo agora, vo postar um codigo q fiz em java de listas, ve c te da uma luz:

 

public class Lista{
	public No prim = null;
	
	public No criarNo(int dado){
		No tmp   = new No();
		tmp.dado = dado;
		tmp.prox = null;
		return(tmp);
	}
	
	public void insereNo(int dado){
		No novo   = criarNo(dado);
		novo.prox = prim;
		prim	  = novo;
	}
	
	public void listarNo(){
		No tmp = prim;
		while(tmp != null){
			System.out.println("\t\t" + tmp.dado);
			tmp = tmp.prox;
		}
	}
	
	public void consultarNo(int dado){
		int achou   = 0;
		No tmp	  = prim;
		int contNo  = 1;
		while(tmp != null){
			if (tmp.dado == dado) {
				System.out.println("\t\tDado: " + dado + " encontrado no No: " + contNo);
				achou = 1;
			}
			tmp = tmp.prox;
			++contNo;
		}
		if (achou == 0) System.out.println("\t\tDado " + dado + " nao encontrado.");
	}
	
	public No buscaNo(int dado){
		No tmp = prim;
		if (prim != null) {
			while(tmp != null) {
				if (tmp.dado == dado) break;
				else tmp = tmp.prox;
			}
		}
		return tmp;
	}
	
	public void inserirNomeio(int dado, int dadoAnt){
		No tmp = criarNo(dado);
		No aux = buscaNo(dadoAnt);
		if (aux == null) {
			tmp.prox = prim;
			prim = tmp;
			
		}
		else {
			tmp.prox = aux.prox;
			aux.prox = tmp;
		}
	}
	
	public void inserirNofim(int dado){
		No tmp = criarNo(dado);
		No aux = prim;
		if(prim != null){
			while(aux.prox != null) aux = aux.prox;
			aux.prox = tmp;
		}
		else prim = tmp;
	}

	public boolean removerNo(int dado){
		No aux		 = prim;
		boolean remove = false;
		int dadox	  = 0;
		if(prim != null) {
			if (prim.dado == dado){
				prim   = prim.prox;
				remove = true;
			}
			else {
				while(aux != null){					
					if (aux.dado == dadox)
						break;
					else {
						dadox = aux.dado;
						aux   = aux.prox;
					}
				}
				if (aux != null){
					No tmp   = buscaNo(dadox);					
					tmp.prox = aux.prox;
					remove   = true;
				}

			}
		}
		return (remove);
		}
}

[]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que o erro não está ai, eu compilei e fiz alguns testes e não deu erro nenhum...

faça algo que reproduza o erro que você teve e poste aqui para nós darmos uma olhada!

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, aqui funcionou de boa também...faça como o Victor falou e poste aí pra gente testar, abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem pessoal, realmente vi que funcionou de boa, o problema era o seguinte, no trampo não tinha como instalar nada então estava utilizando uma versão do DEV C++ Portable o problema é que por ser portatil ele utiliza o espaço de memória vaziu do pendrive como memoria para carregar o programa, o problema é que o meu pendrive tinha 288 KB livres então dava pau na hora de carregar algunas coisas... tipo não tinha espaço suficiente dai dava erro... pegava lixo bem não sei direito, peguei e copiei o arquivo do Dev C++ para o pc e rodei não deu mais eros. tudo certinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.