Biscoito111 Posted April 10, 2008 at 02:13 PM Report Share #178188 Posted April 10, 2008 at 02:13 PM 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 at 02:37 PM Report Share #178190 Posted April 10, 2008 at 02:37 PM 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 at 02:41 PM Author Report Share #178191 Posted April 10, 2008 at 02:41 PM É 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 at 03:26 PM Report Share #178196 Posted April 10, 2008 at 03:26 PM 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 at 03:29 PM Author Report Share #178198 Posted April 10, 2008 at 03:29 PM 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 at 06:16 PM Report Share #178213 Posted April 10, 2008 at 06:16 PM É 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 at 05:19 PM Author Report Share #178608 Posted April 12, 2008 at 05:19 PM 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 at 05:26 PM Author Report Share #178610 Posted April 12, 2008 at 05:26 PM 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 at 05:54 PM Report Share #178611 Posted April 12, 2008 at 05:54 PM 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 at 06:12 PM Author Report Share #178620 Posted April 12, 2008 at 06:12 PM 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