Ir ao conteúdo
  • Cadastre-se
Raphael Weber

RESOLVIDO Exibição e Armazenamento de Dados em uma Lista Encadeada C

Recommended Posts

Boa Noite amigos, estou apanhando muito pra fazer esse trabalho da faculdade. As vezes da vontade de desistir mas lembrei que tem pessoas que estão ainda existem pessoas dispostas a ajudar/aprender então vamos ao que interessa.

 

Montei um sistema de uma empresa de aviação, deixei definida 3 structs: Avião/Voo/Passagem.

 

Nos testes anteriores que fiz a inserção estava funcionando corretamente, pois quando eu usava a função de imprimir os dados os dados saiam corretamente na tela.  :)

 

Mas eu quero deixar o programa com um menu para facilitar o usuário, usando o famoso CASE, eu insiro os dados e o programa não exibe nada na tela.

 

Descobri que quando eu insiro todos os dados na lista ela ainda continua vazia. :(  

 

Eu acho que o conceito que utilizei esta correto. Mas o programa da erro na hora de exibir os dados, e quando apago diz que não tem nada armazenado.

 

Vou postas o código aqui porque eu não sei mais o que fazer e meu professor não vai me ensinar  :o

 

Por favor me ajudem.

Obrigado.

 

Raphael.

#include <stdio.h>#include <stdlib.h>#include <conio.h>typedef struct estrutura1 {		char modelo [20];	char fabricante [20];	int passageiros;	int comprimento;	int altura;	int velocidade;	int altitude;	char motor [20];		struct estrutura1 *prox_av;	}aviao;typedef struct estrutura2 {	int n_voo;	char data_voo[15];	char hora_voo[15];	char aero_saida[20];	char aero_chegada[20];	char rota_voo[20];	char tempo_voo[15];	int passageiro_bordo;		struct estrutura2 *prox_voo;	}voo;typedef struct estrutura3 {	int n_passagem;	int n_voo_pass;	char data_embarque[10];	char hora_embarque[5];	char portao_embarque[5];		struct estrutura3 *prox_pass;	}passagem;void inserir_aviao(){	aviao * ini_av_ponto; 	aviao * prox_av_ponto; 	int resp_aviao; 	ini_av_ponto = (aviao *)malloc(sizeof(aviao));	prox_av_ponto = ini_av_ponto; 		 while(1) {		 printf("\n");		 printf("Digite o Modelo: ");		 scanf("%s", &prox_av_ponto->modelo); 		 printf("Digite o Fabricante do Aviao: ");		 scanf("%s", &prox_av_ponto->fabricante);		 printf("Digite o Numero de Passageiros: ");		 scanf("%d", &prox_av_ponto->passageiros);		 printf("Digite o Comprimento do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->comprimento);		 printf("Digite a Altura do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->altura);		 printf("Digite a Velocidade Media do Aviao em KM: ");		 scanf("%d", &prox_av_ponto->velocidade);		 printf("Digite a Altitude Suportada do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->altitude);		 printf("Digite o Tipo de Motor do Aviao: ");		 scanf("%s", &prox_av_ponto->motor);    		 printf("Deseja continua? <1> SIM <outro valor> NAO: "); 		 scanf("%d", &resp_aviao); 		  if(resp_aviao == 1){			 prox_av_ponto->prox_av = (aviao *)malloc(sizeof(aviao)); 			 prox_av_ponto = prox_av_ponto->prox_av; 		  }		  else 		  break; 		 }		 prox_av_ponto->prox_av = NULL;	 printf("\n");}void imprimir_aviao(){	 aviao * ini_av_ponto;      aviao * prox_av_ponto;     prox_av_ponto = ini_av_ponto; 	 while(prox_av_ponto != NULL){		 printf("Modelo do Aviao: %s\n", prox_av_ponto->modelo);		 printf("Fabricante: %s\n", prox_av_ponto->fabricante);		 printf("Quantidade Suportada de Passageiros: %d\n", prox_av_ponto->passageiros);		 printf("Comprimento do Aviao em Metros: %d\n", prox_av_ponto->comprimento);		 printf("Altura do Aviao em Metros: %d\n", prox_av_ponto->altura);		 printf("Velocidade em KM: %d\n", prox_av_ponto->velocidade);		 printf("Altitude Suportada do Aviao em Metros: %d\n", prox_av_ponto->altitude);		 printf("Tipo de Motor: %s\n", prox_av_ponto->motor);		 prox_av_ponto = prox_av_ponto->prox_av;	 }}void inserir_voo(){	voo * ini_voo_ponto; 	voo * prox_voo_ponto; 	int resp_voo; 	ini_voo_ponto = (voo *)malloc(sizeof(voo));	prox_voo_ponto = ini_voo_ponto; 		 while(1) {		 printf("\n");		 printf("Digite o Numero do Voo: ");		 scanf("%d", &prox_voo_ponto->n_voo); 		 printf("Digite a Data do Voo. EX: 01/01/2000 ===>: ");		 scanf("%s", &prox_voo_ponto->data_voo);		 printf("Digite o Horario do Voo. EX: 00:00 ===> :  ");		 scanf("%s", &prox_voo_ponto->hora_voo);		 printf("Digite o Aeroporto de Saida: ");		 scanf("%s", &prox_voo_ponto->aero_saida);		 printf("Digite o Aeroporto de Chegada: ");		 scanf("%s", &prox_voo_ponto->aero_chegada);		 printf("Digite a Rota: ");		 scanf("%s", &prox_voo_ponto->rota_voo);		 printf("Digite o Tempo Estimado de Voo em Horas EX: 01:00 ===> : ");		 scanf("%s", &prox_voo_ponto->tempo_voo);		 printf("Digite a Quantidade de Passageiros a Bordo: ");		 scanf("%d", &prox_voo_ponto->passageiro_bordo);      		 printf("Deseja continua? <1> SIM <outro valor> NAO: "); 		 scanf("%d", &resp_voo); 		  if(resp_voo == 1){			 prox_voo_ponto->prox_voo = (voo *)malloc(sizeof(voo)); 			 prox_voo_ponto = prox_voo_ponto->prox_voo; 		  }		  else 		  break; 		 }		 prox_voo_ponto->prox_voo = NULL;	 printf("\n");}void imprimir_voo(){	 voo * ini_voo_ponto;      voo * prox_voo_ponto;     prox_voo_ponto = ini_voo_ponto; 	 while(prox_voo_ponto != NULL){		 printf("Numero do voo: %d\n", prox_voo_ponto->n_voo);		 printf("Data do Voo: %s\n", prox_voo_ponto->data_voo);		 printf("Horario do Voo: %s\n", prox_voo_ponto->hora_voo);		 printf("Aeroporto de Saida: %s\n", prox_voo_ponto->aero_saida);		 printf("Aeroporto de Chegada: %s\n", prox_voo_ponto->aero_chegada);		 printf("Rota: %s\n", prox_voo_ponto->rota_voo);		 printf("Tempo Estimado de Voo em Horas: %s\n", prox_voo_ponto->tempo_voo);		 printf("Quantidade de Passageiros a Bordo : %d\n", prox_voo_ponto->passageiro_bordo);		 prox_voo_ponto = prox_voo_ponto->prox_voo;	 }}int pesquisar_voo(int x){	 voo * ini_voo_ponto;      voo * prox_voo_ponto;     prox_voo_ponto = ini_voo_ponto; 	 int flag_voo = 0;    while(prox_voo_ponto != NULL){		if(prox_voo_ponto->n_voo==x){					 printf("VOO ENCONTRADO:  %d\n", x);		 printf("Numero do voo: %d\n", prox_voo_ponto->n_voo);		 printf("Data do Voo: %s\n", prox_voo_ponto->data_voo);		 printf("Horario do Voo: %s\n", prox_voo_ponto->hora_voo);		 printf("Aeroporto de Saida: %s\n", prox_voo_ponto->aero_saida);		 printf("Aeroporto de Chegada: %s\n", prox_voo_ponto->aero_chegada);		 printf("Rota: %s\n", prox_voo_ponto->rota_voo);		 printf("Tempo Estimado de Voo em Horas: %s\n", prox_voo_ponto->tempo_voo);		 printf("Quantidade de Passageiros a Bordo : %d\n", prox_voo_ponto->passageiro_bordo);		 flag_voo = 1;		 prox_voo_ponto = NULL;		}				else{			prox_voo_ponto = prox_voo_ponto->prox_voo;		}				if(flag_voo == 0){			printf("VOO NAO ENCONTRADO");		}	}}void inserir_passagem(){	passagem * ini_pass_ponto; 	passagem * prox_pass_ponto; 	int resp_pass; 	ini_pass_ponto = (passagem *)malloc(sizeof(passagem));	prox_pass_ponto = ini_pass_ponto; 		 while(1) {		 printf("\n");		 printf("Digite o Numero da Passagem: ");		 scanf("%d", &prox_pass_ponto->n_passagem); 		 printf("Digite o Numero do Voo: ");		 scanf("%d", &prox_pass_ponto->n_voo_pass);		 printf("Digite a Data de Embarque :  ");		 scanf("%s", &prox_pass_ponto->data_embarque);		 printf("Digite a Hora de Embarque: ");		 scanf("%s", &prox_pass_ponto->hora_embarque);		 printf("Digite o Portao de Embarque: ");		 scanf("%s", &prox_pass_ponto->portao_embarque);	  		 printf("Deseja continua? <1> SIM <outro valor> NAO: "); 		 scanf("%d", &resp_pass); 		  if(resp_pass == 1){			 prox_pass_ponto->prox_pass = (passagem *)malloc(sizeof(passagem)); 			 prox_pass_ponto = prox_pass_ponto->prox_pass; 		  }		  else 		  break; 		 }		 prox_pass_ponto->prox_pass = NULL;	 printf("\n");}void imprimir_passagem(){	passagem * ini_pass_ponto; 	passagem * prox_pass_ponto; 	prox_pass_ponto = ini_pass_ponto; 	 	 while(prox_pass_ponto != NULL){		 printf("Numero da Passagem: %d\n", prox_pass_ponto->n_passagem);		 printf("Numero do Voo: %d\n", prox_pass_ponto->n_voo_pass);		 printf("Data de Embarque: %s\n", prox_pass_ponto->data_embarque);		 printf("Hora de Embarque: %s\n", prox_pass_ponto->hora_embarque);		 printf("Potao de Embarque: %s\n", prox_pass_ponto->portao_embarque);		 prox_pass_ponto = prox_pass_ponto->prox_pass;	 }}int pesquisar_passagem(int y){	passagem * ini_pass_ponto; 	passagem * prox_pass_ponto; 	prox_pass_ponto = ini_pass_ponto; 	int flag_passagem = 0;    while(prox_pass_ponto != NULL){		if(prox_pass_ponto->n_passagem==y){					 printf("PASSAGEM ENCONTRADA:  %d\n", y);		 printf("Numero da Passagem: %d\n", prox_pass_ponto->n_passagem);		 printf("Numero do Voo: %d\n", prox_pass_ponto->n_voo_pass);		 printf("Data de Embarque: %s\n", prox_pass_ponto->data_embarque);		 printf("Hora de Embarque: %s\n", prox_pass_ponto->hora_embarque);		 printf("Potao de Embarque: %s\n", prox_pass_ponto->portao_embarque);		 flag_passagem = 1;		 prox_pass_ponto = NULL;		}				else{			prox_pass_ponto = prox_pass_ponto->prox_pass;		}				if(flag_passagem == 0){			printf("VOO NAO ENCONTRADO");		}	}}void excluir_voo(){	 int z,count = 0;	 voo * ini_voo_ponto;      voo * atual_voo_ponto;      voo * anterior_voo_ponto;          printf("Digite o voo a ser excluido");     scanf("%d",&z);          if(ini_voo_ponto->prox_voo==NULL){     	printf("Nao existe voos cadastrados");     }     	 else{	 		 	anterior_voo_ponto=ini_voo_ponto;	 	for(atual_voo_ponto=ini_voo_ponto->prox_voo; atual_voo_ponto!=NULL; atual_voo_ponto=atual_voo_ponto->prox_voo){	 			 		if(z==atual_voo_ponto->n_voo){	 			anterior_voo_ponto->prox_voo = atual_voo_ponto->prox_voo;	 			free(atual_voo_ponto);	 			count=1;	 			printf("Dados Deletados com Sucesso: ");	 		}	 					if(count==1){			 	break;			 	anterior_voo_ponto=atual_voo_ponto;			}						if(atual_voo_ponto->prox_voo==NULL && count==0){				 printf("\nRegistro para exclusao nao encontrado!\n");			} 	 	}		 				 			}	 	}     void menu(){	int pesq_voo,pesq_passagem,operacao;printf("Bem Vindo ao Sistema de VOEBEM 1.0\n");printf("\nDigite uma Opcao: \n\n01 - Inserir Voo\n02 - Buscar Voo\n03 - Exibir Voo\n04 - Deletar Voo\n05 - Inserir Passagem\n06 - Buscar Passagem\n07 - Exibir Passagem\n08 - Inserir Aviao\n09 - Exibir Aviao\n10 - Sair\n\n");scanf("%d",&operacao);system("cls");switch(operacao){	while (operacao!=11){	case 1:		inserir_voo();		printf("Dados Inseridos com Sucesso");		getch();		system("cls");		menu();			case 2:		printf("Digite o Numero do Voo\n");		scanf("%d", &pesq_voo);		pesquisar_voo(pesq_voo);		getch();		system("cls");		menu();	case 3:		imprimir_voo();		getch();		system("cls");		menu();	case 4:		excluir_voo();		getch();		system("cls");		menu();	case 5:		inserir_passagem();		printf("Dados Inseridos com Sucesso");		getch();		system("cls");		menu();	case 6:		printf("Digite o Numero da Passagem\n");		scanf("%d", &pesq_passagem);		pesquisar_voo(pesq_passagem);		getch();		system("cls");		menu();	case 7:		imprimir_passagem();		getch();		system("cls");		menu();	case 8:		inserir_aviao();		printf("Dados Inseridos com Sucesso");		getch();		menu();	case 9:		imprimir_aviao();		getch();		menu();	case 10:        break;        system("PAUSE");	}  }}int main(int argc, char *argv[]) { menu();system ("pause");return 0;}

post-737558-0-05193100-1411004570_thumb.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salvo eu ter lido seu código errado, você até parece saber como operar a lista, mas cometeu um equivoco.

 

Todos os seus ponteiros são de escopo automático, ou seja, quando a função acaba ele são destruídos, e pior, a memória fica alocada sem ninguém apontando para ela!!!

 

Talvez se você mantiver pelo menos o seu ponteiro inicial da lista como global, o seus problemas se resolverão.

 

Lembre-se de não mover esse ponteiro para frente, senão você perde a referência da lista E desaloque toda a memória antes de encerrar o programa.

 

Não é como eu gosto de programar, mas C vale tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

EdmorteMuito obrigado amigo, você ja abriu minha mente, me ajudou muito. Mas quando você diz: Talvez se você mantiver pelo menos o seu ponteiro inicial da lista como global, o seus problemas se resolverão. Você diz. pegar todos esses ponteiros iniciais das funções e coloca-los na função main!?

 

Obrigado pela atenção.

 

Você pode me dar um exemplo em menor escala?

Compartilhar este post


Link para o post
Compartilhar em outros sites
// Agora esses ponteiros serão globaisaviao* ini_av_ponto = NULL; voo* ini_voo_ponto = NULL;passagem* ini_pass_ponto = NULL; void inserir_aviao(){	aviao * prox_av_ponto; 	int resp_aviao;		 while(1) {	 	// Essa é uma solução paleativa, prefiro outras, mas...		// Desse modo vamos sempre inserir no começo da lista, é a forma mais simples		prox_av_ponto = (aviao*)malloc(sizeof(aviao));		prox_av_ponto->prox_av = ini_av_ponto;				// Esse é o novo começo da lista		ini_av_ponto = prox_av_ponto;				 printf("\n");		 printf("Digite o Modelo: ");		 scanf("%s", &prox_av_ponto->modelo); 		 printf("Digite o Fabricante do Aviao: ");		 scanf("%s", &prox_av_ponto->fabricante);		 printf("Digite o Numero de Passageiros: ");		 scanf("%d", &prox_av_ponto->passageiros);		 printf("Digite o Comprimento do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->comprimento);		 printf("Digite a Altura do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->altura);		 printf("Digite a Velocidade Media do Aviao em KM: ");		 scanf("%d", &prox_av_ponto->velocidade);		 printf("Digite a Altitude Suportada do Aviao em Metros: ");		 scanf("%d", &prox_av_ponto->altitude);		 printf("Digite o Tipo de Motor do Aviao: ");		 scanf("%s", &prox_av_ponto->motor);    		 printf("Deseja continua? <1> SIM <outro valor> NAO: "); 		 scanf("%d", &resp_aviao); 				if(resp_aviao != 1) {			break;		}	 }	 printf("\n");}void imprimir_aviao(){	 // Virou global	 //aviao * ini_av_ponto;     aviao* prox_av_ponto = ini_av_ponto; 	 while(prox_av_ponto != NULL){		 printf("Modelo do Aviao: %s\n", prox_av_ponto->modelo);		 printf("Fabricante: %s\n", prox_av_ponto->fabricante);		 printf("Quantidade Suportada de Passageiros: %d\n", prox_av_ponto->passageiros);		 printf("Comprimento do Aviao em Metros: %d\n", prox_av_ponto->comprimento);		 printf("Altura do Aviao em Metros: %d\n", prox_av_ponto->altura);		 printf("Velocidade em KM: %d\n", prox_av_ponto->velocidade);		 printf("Altitude Suportada do Aviao em Metros: %d\n", prox_av_ponto->altitude);		 printf("Tipo de Motor: %s\n", prox_av_ponto->motor);		 prox_av_ponto = prox_av_ponto->prox_av;	 }}

Fiz uma adaptação aqui de cabeça, compila mas não sei se está ok a inserção. Acho que está.

 

Claro que eu só fiz em um trecho do código o resto você adapta.

 

Seu scanf está errado para char[], quando você usa array não deve passar o &, pois o array no C já é sempre passado por referência.

 

Não se esqueça de antes de finalizar o programa desalocar toda essa memória. Tem que fazer um loop e ir desalocando item por item.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×