Jump to content
jett

Árvore binária em arquivo

Recommended Posts

jett

Bom, estou tentando criar um programa que armazena informações numa árvore binária (grava e lê) em disco:

typedef struct arvore{
   int id;
   char marca[50];
   char modelo[50];
   char cor[20];
   char proprietario[50];
   struct arvore *dir;
   struct arvore *esq;
}arvore;

arvore *aloca(){
   arvore *novo = (arvore*)malloc(sizeof(arvore));
   printf("Entre com a Identificacao do veiculo: ");
   scanf("%d", &(novo->id));
   printf("Digite a marca do veiculo: ");
   fflush(stdin);
   fgets(novo->marca, 50, stdin);
   printf("Digite o modelo do veiculo: ");
   fgets(novo->modelo, 50, stdin);
   printf("Digite a cor do veiculo: ");
   fgets(novo->cor, 20, stdin);
   printf("Digite o nome do proprietario do veiculo: ");
   fgets(novo->proprietario, 50, stdin);
   return novo;
}

void cadastrar(arvore **T, arvore *novo){
   if((*T) == NULL){
           novo->dir = NULL;
           novo->esq = NULL;
           (*T) = novo;
   }
   else{
           if(novo->id == (*T)->id){
               printf("\nVeiculo ja cadastrado!\n");
   }
   else if(novo->id < (*T)->id){
           cadastrar(&((*T)->esq), novo);
   }
   else{
           cadastrar(&((*T)->dir), novo);
   }
   }
  salvaArquivo(*T);
   }

void salvaArquivo(arvore *T){
   FILE *arq;
   arq = fopen("arquivo.txt","w");
   salvaItem(T,arq);
   fclose(arq);
}

void salvaItem (arvore *T, FILE *arq){
   fwrite(&T->id,sizeof(int),1,arq);
   fwrite(&T->marca,sizeof(char),31,arq);
   fwrite(&T->modelo,sizeof(char),31,arq);
   fwrite(&T->cor,sizeof(char),31,arq);
   fwrite(&T->proprietario,sizeof(char),31,arq);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

O problema é que quando compilo, aparece o seguinte:

warning: conflicting types for 'salvaArquivo' [enabled by default]|

warning: conflicting types for 'salvaItem' [enabled by default]|

Onde estou errando?

Edited by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

Todas as funcoes tem de ser conhecidas pelo compilador antes de serem chamadas.

No teu caso -- nao sao.

Por isso o compilador assume certas coisas, por exemplo que as funcoes devolvem um int.

Mais tarde, quando defines as funcoes, nao as defines como devolvendo um int, indo contra o que o compilador assumiu e originando o warning.

Solucao 1: fornece um prototipo para as funcoes antes de as chamar

Solucao 2: altera a ordem da definicao das funcoes, para que todas as funcoes estejam definidas antes de serem chamadas (uma definicao serve como prototipo)

Edited by pmg
  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
jett

Todas as funcoes tem de ser conhecidas pelo compilador antes de serem chamadas.

No teu caso -- nao sao.

Por isso o compilador assume certas coisas, por exemplo que as funcoes devolvem um int.

Mais tarde, quando defines as funcoes, nao as defines como devolvendo um int, indo contra o que o compilador assumiu e originando o warning.

Solucao 1: fornece um prototipo para as funcoes antes de as chamar

SOlucao 2: altera a ordem da definicao das funcoes, para que todas as funcoes estejam definidas antes de serem chamadas (uma definicao serve como prototipo)

Deu certinho agora, obrigada!

Outra dúvida que tenho:

Inseri os dados como ID: 1

marca: ford

modelo: ka

cor: branco

proprietario: marcos

mas quando abro o arquivo aparece o seguinte:

  ford
TERNAME=ADMINISTRADOR ComSpec=C:ka
xe FP_NO_HOST_CHECK=NO HOMEbranco
ssica LOCALAmarcos
:\Umarcos
:\Users\Administrador\AppData

Como faço para gravar de um jeito que fique sem essas variáveis do sistema?

Share this post


Link to post
Share on other sites
pmg

Em vez de fwrite(), usa fprintf()

void salvaItem (arvore *T, FILE *arq){
   fprintf(arq, "%d|%s|%s|etc\n", T->id, T->marca, T->modelo/*, etc*/);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

O que te esta a aparecer no ficheiro é o lixo que ficou depois do '\0' dos inputs


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
jett

Agora estou tentando arquivar no arquivo de modo ordenado, mas não está dando certo:

void salvaItem (arvore *T, FILE *arq){
   fprintf(arq, "ID: %d\nMARCA: %sMODELO: %sCOR: %sPROPRIETARIO: %s\n", T->id, T->marca, T->modelo, T->cor, T->proprietario);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

void salvaArquivo(arvore *T){
   salvaArquivo(T->esq);
   FILE *arq;
   arq = fopen("arquivo.txt","w");
   salvaItem(T,arq);
   fclose(arq);
   salvaArquivo(T->dir);
}

Edited by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

Tens que 'recursar' tudo à esquerda antes de imprimir o nó.

Basta-te trocar a ordem das duas primeiras instruções :)

void salvaItem (arvore *T, FILE *arq){
   if(T->esq)salvaItem(T->esq,arq);
   fprintf(arq, "ID: %d\nMARCA: %sMODELO: %sCOR: %sPROPRIETARIO: %s\n", T->id, T->marca, T->modelo, T->cor, T->proprietario);
   if(T->dir)salvaItem(T->dir,arq);
}

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.