Jump to content

[Resolvido] Dúvida-passar informação de um ficheiro binário para lista ligada


Biscoito111
 Share

Recommended Posts

Boas pessoal  😄

Estou aqui à rasca com uma coisa.

Como faço para passar a informação k tenho num ficheiro binario para uma lista ligada?

A ideia é: à medida k vai lendo o ficheiro vai passando para uma lista ligada cada nó da lista criada na altura.

Tipo isto:

pno grava_ficheiro(pno p)    //função onde foi guardada a informação da lista para um ficheiro binario
{
FILE *f;

f=fopen("fila.bin","wb");
if(f==NULL)
{
	printf("Erro ao abrir o ficheiro\n");
	return p;
}
while(p!=NULL)
{
	fwrite(p,sizeof(no),1,f);
	p=p->prox;
}

fclose(f);
return p;
}

pno recupera_lista()           //função que faz o contrario k a anteiror, passa de um ficheiro binario para uma lista ligada
{
pno lista=NULL,novo;
no A;
FILE *f;

f=fopen("fila.bin","rb");
if(f==NULL)
{
	printf("Erro ao abrir o ficheiro");
	system("pause");
}
while(fread(&A,sizeof(no),1,f)==1)
{
	novo=malloc(sizeof(no));
	*novo=A;
	novo->prox=NULL;
	//Inserção no final da lista

}
fclose(f);

return lista;
}

Alguem me pode ajudar a completar a função recupera_lista()?

Obrigado 👍

Tiago Simões

Link to comment
Share on other sites

É assim k tas a dizer?

pno recupera_lista()           
{	
pno lista=NULL,novo,ant;	
no A;	
FILE *f; 	
f=fopen("fila.bin","rb");	
if(f==NULL)
{		
                             printf("Erro ao abrir o ficheiro");		
                             system("pause");	
                      }	
while(fread(&A,sizeof(no),1,f)==1)	
{		
novo=malloc(sizeof(no));		
*novo=A;		
novo->prox=NULL;		
lista=ant=novo;
ant->prox = novo;
ant = novo;

}	
fclose(f); 	
return lista;
}

Tiago Simões

Link to comment
Share on other sites

Fix kom um ponteiro prox.vote mostrar o código todo:

#include<stdio.h>
#include<stdlib.h>

typedef struct pessoa no,*pno;

pno insere_ord(pno p);
int preenche(pno p);
int mostra_info(pno p);
pno atendimento(pno p);
pno grava_ficheiro(pno p);
pno recupera_lista();

struct pessoa{
char nome[100];
int prior;
pno prox;
};

int main()
{
int cont=0;
pno lista=NULL;
do{
	lista=insere_ord(lista);
	cont++;
}while(cont!=3);
mostra_info(lista);
lista=atendimento(lista);
mostra_info(lista);
lista=grava_ficheiro(lista);
lista=recupera_lista();
mostra_info(lista);


return 0;
}

pno insere_ord(pno p)
{
pno novo, aux;
novo = malloc(sizeof(no));
if(novo==NULL)
{
	printf("Erro na requisição de memoria\n");
	return p;
}
preenche(novo);
if(p==NULL || p->prior > novo->prior)
{
	novo->prox=p;
	p=novo;
}
else
{
	aux=p;
	while(aux->prox!=NULL && aux->prox->prior <= novo->prior)
		aux=aux->prox;
	novo->prox = aux->prox;
	aux->prox = novo;
}	
return p;
}

int preenche(pno p)
{
printf("Nome: ");
fflush(stdin);
gets(p->nome);
do{
	printf("Prioridade((1)gravidas,(2)idosos e criancas,(3)restantes pacientes): ");
	scanf("%d",&(p->prior));
}while(p->prior!=1 && p->prior!=2 && p->prior!=3);

p->prox=NULL;

return 0;
}

pno atendimento(pno p)
{
pno aux;
if(p==NULL)
{
	printf("Lista esta vazia");
	system("pause");
	return p;
}
else
{
	aux=p;
	p=p->prox;
	printf("O paciente %s vai ser atendido\n",aux->nome);
	system("pause");
	free(aux);
	return p;
}
}

int mostra_info(pno p)
{
while(p!=NULL)
{
	printf("\nNome: %s\nPrioridade: %d\n\n",p->nome,p->prior);
	p=p->prox;
}

return 0;
}

pno grava_ficheiro(pno p)
{
FILE *f;

f=fopen("fila.bin","wb");
if(f==NULL)
{
	printf("Erro ao abrir o ficheiro\n");
	return p;
}
while(p!=NULL)
{
	fwrite(p,sizeof(no),1,f);
	p=p->prox;
}

fclose(f);
return p;
}

pno recupera_lista()
{
pno lista=NULL,novo,ant;
no A;
FILE *f;

f=fopen("fila.bin","rb");
if(f==NULL)
{
	printf("Erro ao abrir o ficheiro");
	system("pause");
}
while(fread(&A,sizeof(no),1,f)==1)
{
	novo=malloc(sizeof(no));
	*novo=A;
	novo->prox=NULL;
	//Inserção no final da lista
	lista=ant=novo;
	ant->prox = novo;
	ant = novo;

}
fclose(f);

return lista;
}

Bem vou pas aulas...

Tiago Simões

Link to comment
Share on other sites

É assim k tas a dizer?

pno recupera_lista()           
{	
pno lista=NULL,novo,ant;	
no A;	
FILE *f; 	
f=fopen("fila.bin","rb");	
if(f==NULL)
{		
                             printf("Erro ao abrir o ficheiro");		
                             system("pause");	
                      }	
while(fread(&A,sizeof(no),1,f)==1)	
{		
novo=malloc(sizeof(no));		
*novo=A;		
novo->prox=NULL;		
lista=ant=novo;
ant->prox = novo;
ant = novo;

}	
fclose(f); 	
return lista;
}

É quase. Ali a linha lista=ant=novo; tem que estar dentro de um if com a condição que disse no post anterior, senão vais estar sempre a acrescentar na 2ª posição e perdes os apontadores para os elementos já existentes.

Desaparecido.

Link to comment
Share on other sites

pno recupera_lista()
{
pno lista=NULL,novo,ant;
no A;
FILE *f;

f=fopen("fila.bin","rb");
if(f==NULL)
{
	printf("Erro ao abrir o ficheiro");
	system("pause");
}
while(fread(&A,sizeof(no),1,f)==1)
{
	novo=malloc(sizeof(no));
	*novo=A;
	novo->prox=NULL;
	//Inserção no final da lista
	if(lista==NULL)
		lista=ant=novo;
	ant->prox = novo;
	ant = novo;

}
fclose(f);

return lista;
}

Eu só ainda nao estou a perceber bem estes passos k pus aqui em baixo(o primeiro klaro k percebo, agora os seguintes ek ainda nao tou a pescar bem), alguem k me explique 👍 :

novo=malloc(sizeof(no));

*novo=A;

novo->prox=NULL;

if(lista==NULL)

     lista=ant=novo;

ant->prox = novo;

ant = novo;

Tiago Simões

Link to comment
Share on other sites

Suponho que as 3 primeiras linhas percebas, porque escreveste-as antes de qualquer sugestão minha.

novo=malloc(sizeof(no));
*novo=A;
novo->prox=NULL;
if(lista==NULL) // se lista for NULL significa que ainda não foi adicionado nenhum elemento
     lista=ant=novo; // é adicionado o 1º elemento, e lista deixa de ser NULL. ant aponta sempre para o elemento adicionado na iteração anterior
ant->prox = novo; // o prox do elemento anterior fica a apontar para o novo
ant = novo; // na próxima iteração, o elemento anterior será o elemento que foi inserido agora

Desaparecido.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.