Biscoito111 Posted April 10, 2008 Report Share Posted April 10, 2008 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 More sharing options...
TheDark Posted April 10, 2008 Report Share Posted April 10, 2008 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 Desaparecido. Link to comment Share on other sites More sharing options...
Biscoito111 Posted April 10, 2008 Author Report Share Posted April 10, 2008 É 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 More sharing options...
suzy Posted April 10, 2008 Report Share Posted April 10, 2008 biscoito. as listas ligadas fizeste com um array de ponteiros? que apontam para uma lista ligada? 😄 Link to comment Share on other sites More sharing options...
Biscoito111 Posted April 10, 2008 Author Report Share Posted April 10, 2008 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 More sharing options...
TheDark Posted April 10, 2008 Report Share Posted April 10, 2008 É 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 More sharing options...
Biscoito111 Posted April 12, 2008 Author Report Share Posted April 12, 2008 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 😄 Cumps 👍 Tiago Simões Link to comment Share on other sites More sharing options...
Biscoito111 Posted April 12, 2008 Author Report Share Posted April 12, 2008 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 More sharing options...
TheDark Posted April 12, 2008 Report Share Posted April 12, 2008 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 More sharing options...
Biscoito111 Posted April 12, 2008 Author Report Share Posted April 12, 2008 Já percebi. Tava complicado lol. Tiago Simões Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now