Olá! Me lembro de ter tentado algo parecido porém não tenho certeza. Irei testar. Mas pelo que entendi, cada "novo" retornado pela função é um nó da lista, que na função main é atribuído a "l", assim, mantendo uma sequência, porém não tenho certeza... Vou postar meu código completo para uma melhor análise.
adicionado 8 minutos depois
@arfneto
Muito grato pela atenção!
Interessante o seu raciocínio, irei estuda-lo com mais calma, programação ainda é um pouco complexo para mim, rs!
Consegui "resolver" chamando a função várias vezes, porém sim, está lendo tudo invertido...
Segue o meu código completo para melhor análise:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dirent.h>
//--------estrutura--------
typedef struct lista {
char nome[20];
char sobrenome[20];
int RG;
int n_voo;
struct lista *prox;
}Lista;
//-------protótipos--------
Lista *inicializa (void);
Lista *insere (Lista *l);
Lista *insereTxt (Lista *l, char line[]);
Lista *busca (Lista *);
Lista *libera(Lista *l);
Lista *retira (Lista *l);
void criaTxt(Lista *l);
void DisplayList (Lista *l);
void vazia (Lista *l);
//----------inicio----------
int main (void){
Lista *l; /* declara uma lista não inicializada */
l = inicializa(); /* inicializa lista como vazia */
int mOpcao;
do{
printf("\n----------------------------MENU-----------------------------\n");
printf("Para ADICIONAR um novo passageiro, pressione \t1:\n");
printf("Para REMOVER um passageiro, pressione \t\t2:\n");
printf("Para LISTAR os passageiros, pressione \t\t3:\n");
printf("Para BUSCAR um passageiro, pressione \t\t4:\n");
printf("Para IMPORTAR uma lista, pressione \t\t5:\n");
printf("Para SALVAR alteracoes, pressione \t\t6:\n");
printf("Para SAIR do programa, pressione \t\t7:\n");
printf("----------------------------MENU-----------------------------\n");
printf("\n --> DIGITE UMA DAS opções DO MENU E PRESSIONE ENTER: ");
scanf("%d", &mOpcao);
switch (mOpcao){
case 1:
l = insere(l);
system("cls");
break;
case 2:
retira(l);
system("cls");
break;
case 3:
DisplayList(l);
system("cls");
break;
case 4:
busca(l);
system("cls");
break;
case 5:
if(l != NULL)
l = libera(l);
char line[50];
system("ls");
FILE *voo;
voo = fopen("voo.txt","r");
printf("\n----------------------IMPORTANDO LISTA-----------------------\n");
while(fgets(line, 50, voo) != NULL)
l = insereTxt(l, line);
fclose(voo);
printf("\n --> Lista importada com sucesso!\n\n");
system("pause");
system("cls");
break;
case 6:
criaTxt(l);
system("cls");
break;
}
}while(mOpcao != 7);
//vazia(l);
system("pause");
return 0;
}
Lista *inicializa (void){//inicializa lista.
return NULL;
}
void DisplayList(Lista *l){
Lista *novo=l;
printf("\n--------------------LISTA DE PASSAGEIROS---------------------\n");
if(novo == NULL)
printf("\n --> ERRO: Nao ha passageiros na memoria, importe uma lista ou adicione novos passageiros.\n");
for(novo=l; novo!=NULL; novo=novo->prox){
printf("Nome: %s %s \t| RG: %d\n", novo->nome, novo->sobrenome, novo->RG);
}
printf("\n");
system("pause");
}
Lista *insere (Lista *l){
printf("\n-------------------ADICIONANDO PASSAGEIROS--------------------\n");
printf("\nPRESSIONE ENTER PARA COMECAR\n");
char inome[20];
char isobrenome[20];
int iRG;
printf("\nNOME: ");
scanf("%s", inome);
printf("\nSOBRENOME: ");
scanf("%s", isobrenome);
printf("\nRG: ");
scanf("%d", &iRG);
Lista *novo = (Lista*) malloc(sizeof(Lista));
novo->prox = l;
novo->RG = iRG;
strcpy(novo->nome, inome);
strcpy(novo->sobrenome, isobrenome);
printf("\nPASSAGEIRO ADICIONADO COM SUCESSO!\n");
system("pause");
return novo;
}
Lista *insereTxt (Lista *l, char line[]){
Lista *novo = NULL;
int iRG;
char itemp_nome[20];
char itemp_sobrenome[20];
sscanf(line, "%s %s %d", itemp_nome, itemp_sobrenome, &iRG);
novo = (Lista*) malloc(sizeof(Lista));
novo->prox = l;
novo->RG = iRG;
strcpy(novo->nome, itemp_nome);
strcpy(novo->sobrenome, itemp_sobrenome);
return novo;
}
void criaTxt(Lista *l){
Lista *p = l;
printf("\n------------------------SALVANDO VOO-------------------------\n");
printf("\n --> ANTENCAO: Essa alteracao ira sobrescrever o arquivo anterior.\n");
printf("\n --> Pressione ENTER para aplicar ou QUALQUER OUTRA TECLA para recusar.\n");
if(getch()==13){
if(p != NULL){
FILE *voo;
voo= fopen("voo.txt", "w");
for (p = l; p != NULL; p = p->prox){
char temp_nome[20];
char temp_sobrenome[20];
int temp_RG;
strcpy(temp_nome, p->nome);
strcpy(temp_sobrenome, p->sobrenome);
temp_RG=p->RG;
fprintf(voo, "%s %s %d\n", temp_nome, temp_sobrenome, temp_RG);
}
fclose(voo);
}
else
printf("\n --> ERRO: Nao foi feita nenhuma alteracao, nao foi possivel salvar o arquivo.\n\n");
}
system("pause");
}
Lista *busca(Lista *l){
Lista *p;
int bRG;
printf("Digite o RG a ser buscado: ");
scanf("%d", &bRG);
for (p=l; p !=NULL; p=p->prox){
if (bRG == p->RG){
printf("Passageiro encontrado. %d\n");
system("pause");
return p;
}
else{
printf("Passageiro nao encontrado.\n"); // não achou o elemento
system("pause");
return NULL;
}
}
}
Lista *retira (Lista *l) {
Lista* ant = NULL; /* ponteiro para elemento anterior */
Lista* p = l; /* ponteiro para percorrer a lista*/
int rRG;
printf("\n --> Digite o RG do passageiro a ser removido: \n");
scanf("%d", &rRG);
/* procura elemento na lista, guardando anterior */
while (p != NULL && p->RG != rRG) {
ant = p;
p = p->prox;
}
/* verifica se achou elemento */
if (p == NULL){
system("pause");
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);
system("pause");
return l;
}
Lista *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
}
return p;
}
/*void vazia (Lista *l){
printf("\nStatus da lista: ");
if (l == NULL)
printf("Vazia\n");
else
printf("Cheia\n");
}*/
O que você acha?
Agora estou com mais um problema, preciso listar minhas "tabelas" .txt, escolher uma e abri-la... Não sei como posso fazer isso.