Ir para conteúdo

Arquivado

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

Paloma

Listas Encadeadas

Recommended Posts

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

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 if
Caso 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

×

Informação importante

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