Edultra 13 Denunciar post Postado Abril 2, 2009 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
quitZAUMMM 18 Denunciar post Postado Abril 3, 2009 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
VictorCacciari 42 Denunciar post Postado Abril 3, 2009 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
gRoOvE 0 Denunciar post Postado Abril 3, 2009 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
Edultra 13 Denunciar post Postado Abril 13, 2009 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