Agenda com Árvore Binária - C

3 respostas
E

Boa noite.

Tenho que criar uma Agenda com Árvore Binária em C.
Mas o problema é que ela só está substituindo os registros já gravados. Na listagem, aparece apenas o ultimo registro informado.

Segue o código:

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

typedef struct Contatos{
   int codigo;
   char nome[10];
}Contatos;

typedef struct Raiz{
   Contatos* contato;  
   struct Raiz* esquerda;
   struct Raiz* direita;
}Arvore;

/*
Arvore* criaArvore(){
   return NULL;
}
*/
Arvore* insere(Arvore* Arv, Contatos *Reg){
   if(Arv == NULL){
      Arv = (Arvore*) malloc(sizeof(Arvore));
      Arv->contato = Reg;
      Arv->esquerda = NULL;
      Arv->direita = NULL;
   }
   else{
      if((Arv->contato->codigo) < (Reg->codigo))
         Arv->esquerda = insere(Arv->esquerda, Reg);
      else
        if((Arv->contato->codigo) > (Reg->codigo))
           Arv->direita = insere(Arv->direita, Reg);
   }
   return Arv;
}

void exibirOrd(Arvore *Arv){
   if(Arv != NULL){
      exibirOrd(Arv->esquerda);
      printf("\nCodigo: %d ",Arv->contato->codigo);
      printf("\nNome: %s ",Arv->contato->nome);
      exibirOrd(Arv->direita);
   }
}

int main(){
  int op;
  Arvore *Arv = NULL;
  Contatos cont;

  do{
      system("cls");
      printf(">> MENU <<");
      
      printf("\n\n[1] - INSERIR"
             "\n[2] - EXIBIR");
             
      printf("\n\nOPCAO: ");
      scanf("%d",&op);
      switch (op){
         case 1:
                system("cls");
                printf("Codigo: ");
                scanf("%d",&cont.codigo);
                printf("Nome: ");
                setbuf(stdin, NULL);
                gets(cont.nome);
                Arv = insere(Arv, &cont);        
                fflush(stdin);
                getchar();
                break;
         case 2:
                exibirOrd(Arv);
                fflush(stdin);
                getchar();
                break;
      }
  }while(op != 3);
  
  fflush(stdin);
  getchar();
  return 0;
}

Sobre a struct Contatos, está correto o uso dessa forma?

Abraço!

3 Respostas

V

olá amigo fiz um exercicio de treino muito perecido com o seu soque ao invez de gravar nomes o meu grava pastas ve se te ajuda é so fazer uma analogia e seguir o codigo

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

FILE *arq;
typedef struct diretorio
{
    char nome_pasta[100];
    char info[100];
    char descricao[100];
    char nome_dir[100];
}Diretorio;

typedef struct elo
{
    Diretorio f;
    struct elo *dir;
    struct elo *esq;
}Elo;

typedef Elo *raiz;

raiz cria()
{
    return NULL;
}
int vazia(raiz a)
{
    return (a == NULL);
}
raiz insere(raiz a, Diretorio b)
{
    if(vazia(a))
    {
      raiz nova;
      nova = (raiz)malloc(sizeof(Elo));
      nova->esq = NULL;
      nova->dir = NULL;
      nova->f = b;

      return nova;
    }
    else
    {
        if(strcmp(a->f.nome_pasta,b.nome_pasta) < 0)
        {
            a->dir = insere(a->dir,b);
        }
        else
        {
            a->esq = insere(a->esq,b);
        }
        return a;
    }
}

raiz procura(raiz a,  char *b)
{
    if(vazia(a))
    {
        return NULL;
    }
      else if(strcmp(a->f.nome_dir,b) == 0)
     {
        return a;
     }
         else if(strcmp(a->f.nome_dir,b) < 0)
        {
              return procura (a->dir,b);
        }
          else
          {
              procura(a->esq,b);
          }
}
void ordem(raiz a)// imprime em ordem esquerda,informação,direita
{
    if(!vazia(a))
    {
        ordem(a->esq);
        printf("\n%s -  %s,%s,%s", a->f.nome_dir,a->f.nome_pasta,a->f.descricao,a->f.info);
        ordem(a->dir);
    }
}
raiz busca(char *pasta, raiz a)// busca elemnto
{
    raiz aux;
    aux = a;
    while(!vazia(aux))
    {
        if(strcmp(aux->f.nome_pasta,pasta) == 0)
        {
            return aux;
        }
        else if(strcmp(aux->f.nome_pasta,pasta) > 0)
        {
           aux = aux->esq;
        }
        else
        {
            aux = aux->dir;
        }
    }
    return NULL;
}
void insere_info() // para o case 1 insere informções, escreve no arquivo binario
{
    Diretorio a;
    int i = 0;

    system("cls");

    printf("numero de pastas que deseja criar: \n");
    scanf("%d",&i);
    arq = fopen("teste","ab");
    while( i > 0)
    {
        printf("Nome do diretorio: \n");
        scanf(" %99[^\n]",a.nome_dir);
        printf("Nome da pasta: \n");
        scanf(" %99[^\n]",a.nome_pasta);
        fflush(stdin);
        printf("Descricao: \n");
        scanf(" %99[^\n]",a.descricao);
        fflush(stdin);
        printf("Informacao: \n");
        scanf(" %99[^\n]",a.info);
        fflush(stdin);
        fwrite(&a,sizeof(a),1,arq);
        i--;
    }
    fclose(arq);
}
raiz gera(raiz a) // gera o arquivo binario
{
    Diretorio s;
    arq = fopen("teste","rb");
    if(arq == NULL)
    {
      printf("nao existem pastas gravadas \n");
      return;
    }
    do
    {
        if(fread(&s,sizeof(s),1,arq) == 1)
        {
            a = insere(a,s);
        }

    }while(!feof(arq));
    fclose(arq);
    return a;
}

int main()
{
  char nome[100];
  raiz a;
  raiz b;
  char pasta[100];

  int opc = 0;

  while(opc != 5)
  {
      system("cls");
      printf("1 - criar pastas: \n");
      printf("2 - exibir todas as pastas: \n");
      printf("3 - procurar pasta: \n");
      printf("4 - excluir pasta \n");
      printf("5 -  sair \n");
      scanf("%d",&opc);

      switch(opc)
      {
        case 1:
             insere_info();
             break;
        case 2:
             system("cls");
             a = NULL;
             a = gera(a);
             ordem(a);
             system("pause>>null");
             break;
        case 3:
            system("cls");
            printf("digite a pasta a ser procurada: \n");
            scanf(" %99[^\n]",nome);
            fflush(stdin);
            a = NULL;
            a = gera(a);
            b = busca(nome,a);

            if(b != NULL)
            {
                printf("pasta encontrada %s -> diretorio: %s",b->f.nome_pasta,b->f.nome_dir);
            }
            else
            {
                printf("pasta não encontrada ou inexistente \n");
            }
            system("pause>>null");
            break;
        case 4:
            fflush(stdin);
            a = NULL;
            printf("apagar pasta, digite o nome da pasta: \n");
            scanf("%99[^\n]",pasta);
            a = gera(a);
            b = procura(a,pasta);
            b = retira(a,pasta);
            printf("pasta: %s excluida do diretorio: %s \n",b->f.nome_pasta,b->f.nome_dir);
            printf("pastas restantes: \n");
            ordem(b);
           system("pause>>null");
           break;
      }
  }
  return 0;
}

qualquer duvida pode perguntar n_n

V

Será que ele está com dúvida a quase quatro anos? Por favor, evite ressuscitar tópicos muito antigos. Além disso, use a tag code para formatar o código de suas postagens.

V

Desculpe amigo é que a 1 semana atras estava com a mesma duvida que ele, porem consegui resolve e estava procurando um item a mais ai achei este topico aqui no forum e pensei que poderia ajudar em algo

Criado 15 de novembro de 2011
Ultima resposta 30 de jun. de 2014
Respostas 3
Participantes 3