Agenda com Árvore Binária - C

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:

[code]#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;
}

[/code]

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

Abraço!

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

[code]#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;
}[/code]

qualquer duvida pode perguntar n_n

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.

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