• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Biscoito111

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

10 mensagens neste tópico

Boas pessoal  :D

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 :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Precisas de mais um apontador (vou chamar-lhe ant) para o nó que inseriste anteriormente. Ou seja, onde tens o comentário, quando lista for NULL fazes lista=ant=novo;.

Depois fazes ant->prox = novo e ant = novo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

biscoito. as listas ligadas fizeste com um array de ponteiros? que apontam para uma lista ligada? :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa ja consegui.

obrigadao mesmo.

eu em c so tou mesmo a nora kom os ficheiros pork d resto tass bem.

bem...vou aki fazer a segunda fase do meu trab d C.

fica bem e mais uma vez obrigado, kualker duvida venho xatear-te  :D

Cumps :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :thumbsup::

novo=malloc(sizeof(no));

*novo=A;

novo->prox=NULL;

if(lista==NULL)

     lista=ant=novo;

ant->prox = novo;

ant = novo;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora