Paloma 0 Denunciar post Postado Abril 10, 2006 Pessoal o código abaixo é um exercício de listas encadeadas, as funções incluir e listar estão compilando normais, mas a função excluir dá erro, alguém pode me dar uma luz :( :unsure: http://forum.imasters.com.br/public/style_emoticons/default/upset.gif :mellow: :wacko: #include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <conio.h>typedef struct edificio{ char nome[51]; int hora; int min; struct edificio *prox;}edf;//VARIÁVEIS GLOBAISchar nome[51];int hora, min;edf *lista;//FUNÇÃO AUXILIARvoid Inserir_Dados (){ printf ("Entre com o nome: "); fflush(stdin); fgets (nome,51,stdin); nome[strlen(nome)-1]='\0';//Remove o /n que a função fgets armazena no buffer. printf ("Entre com a hora: "); fflush(stdin); scanf ("%d",&hora); printf ("Entre com os minutos: "); fflush(stdin); scanf ("%d", &min); printf ("\n");}//FUNÇÃO INCLUIRvoid incluir (){ edf *ptr; Inserir_Dados (); ptr = (edf*)calloc(1,sizeof(edf)); strcpy(ptr -> nome, nome); ptr -> hora = hora; ptr -> min = min; ptr -> prox= NULL; if (lista == NULL) { lista = ptr; } else { ptr -> prox = lista; lista = ptr; }}//FUNÇÃO CRIA LISTA VAZIAedf* vazia(void){ return NULL;}//FUNÇÃO EXCLUIRvoid excluir(){ edf *aux1; edf *aux2; Inserir_Dados(); aux2 = NULL; aux1 = lista; while (aux1!= NULL) { if((strcmp(aux1-> nome,nome)!=0|| (aux1 -> hora != hora) || (aux1 -> min != min))) { aux2 = aux1; aux1 = aux1 -> prox; } } if (aux2 == NULL) { lista = aux1 -> prox; } else { aux2 -> prox = aux1 -> prox; } free (aux1); printf ("O nome foi excluido \n");}//FUNÇÃO LISTARvoid listar(){ edf *aux; aux = lista; while (aux != NULL) { printf ("Nome: %s\n", aux -> nome); printf ("Horas: %d\n", aux -> hora); printf ("Minutos: %d\n\n", aux -> min); aux = aux -> prox; }}//FUNÇÃO PRINCIPALint main(){ char op; lista = vazia(); do{ system("cls"); printf ("(I)ncluir\n"); printf ("(E)xcluir\n"); printf ("(L)istar\n"); printf ("(S)air\n"); printf ("\n"); printf("Digite a opcao: "); op = toupper (getche()); printf ("\n"); switch (op) { case 'I': incluir (); break; case 'E': excluir (); break; case 'L': listar (); break; } system ("PAUSE"); }while(op != 'S'); return (0);} Compartilhar este post Link para o post Compartilhar em outros sites
skimo-solar 0 Denunciar post Postado Abril 13, 2006 Desculpe a demora. Mas aí vai o código como ficou depois de algumas mudanças: //FUNÇÃO EXCLUIRvoid excluir() { edf *aux1; edf *aux2; Inserir_Dados(); aux2 = NULL; aux1 = lista; while (aux1!= NULL) { if(strcmp(aux1 -> nome , nome) || (aux1 -> hora != hora) || (aux1 -> min != min)) { aux2 = aux1; aux1 = aux1 -> prox; } // end if else { if (aux2 == NULL) { lista = aux1 -> prox; free(aux1); } // enf if else { aux2 -> prox = aux1 -> prox; free(aux1); } } // end else } //end do while printf ("O nome foi excluido \n");}Acho que está bem simples de entender, mas aí vai o que eu mudei. O while deve abrangir todos as condicionais, pois ele que vai verificar quando a função acabou. Então, enquanto não acabar ele vai checando. O primeiro if if(strcmp(aux1 -> nome , nome) || (aux1 -> hora != hora) || (aux1 -> min != min)) { aux2 = aux1; aux1 = aux1 -> prox; }Caso o item que você quer excluir seja totalmente diferente do primeiro elemento da lista ele passa para o segundo elemento. E coloca o primeiro em uma variável auxiliar. Caso algum dos termos seja igual, ele executa o else. Dentro do else temos mais um if: if (aux2 == NULL) { lista = aux1 -> prox; free(aux1); } // enf ifCaso aux2 esteja vazio significa que o elemento igual é o primeiro elemento da lista, então simplesmente passamos para o próximo e excluímos este primeiro elemento. Caso não seja o primeiro elemento, vamos fazer o aux2->prox apontar para aux1->prox, e depois vamos excluir o aux1. Como o aux1 vai ter sido excluído o while vai acabar, e teremos o retorno. O único problema da função é que caso você mande excluir alguém que não está na lista ele vai terminar a execução dizendo "Nome excluído". Mas isto é fácil de resolver ;) Se tiver mais dúvidas é só dizer. Compartilhar este post Link para o post Compartilhar em outros sites