//Bibliotecas
#include <stdio.h>
#include <stdlib.h>
//Constantes
#define tamanho 100
#define E 0
#define D 1
#define R -1
//Estrutura
struct str_no {
char dado;
int esquerda;
int direita;
int pai;
};
//Variáveis
struct str_no arvore[tamanho];
int lado, indice = 0;
int opt = -1;
char pai, no;
//Prototipação
void arvore_insere(int pai, char dado, int lado);
int arvore_procura(char dado);
void menu_mostrar(void);
void preOrdem(struct str_no* raiz);
//Função principal
int main(void) {
int temp;
do {
menu_mostrar();
scanf("%d",&opt);
switch (opt){
case 1:
printf("Digite o valor do PAI:\n");
scanf(" %c",&pai);
printf("pai: %c\n",pai);
printf("Digite o valor do NO:\n");
scanf(" %c",&no);
printf("no: %c\n",no);
printf("Digite o lado da subarvore (E=%d/D=%d/R=%d):\n", E,D,R);
scanf(" %d",&lado);
printf("lado: %d\n",lado);
temp = arvore_procura(pai);
arvore_insere(temp, no, lado);
break;
case 2:
printf("Digite o valor do NO:\n");
scanf(" %c",&no);
temp = arvore_procura(no);
printf("No %c\nFilho Esquerda: %c\nFilho Direita: %c\n\n",
arvore[temp].dado,
arvore[arvore[temp].esquerda].dado,
arvore[arvore[temp].direita].dado);
system("read -p 'Pressione Enter para continuar...' var");
break;
case 3:
preOrdem(&arvore[0]);
system("read -p 'Pressione Enter para continuar...' var");
break;
}
}while (opt != 0);
system("read -p 'Pressione Enter para continuar...' var");
return 0;
}
//Inserir nó
void arvore_insere(int pai, char dado, int lado) {
switch (lado){
case E:
arvore[pai].esquerda = indice;
arvore[indice].dado = dado;
arvore[indice].pai = pai;
arvore[indice].esquerda = -1;
arvore[indice].direita = -1;
indice++;
break;
case D:
arvore[pai].direita = indice;
arvore[indice].dado = dado;
arvore[indice].pai = pai;
arvore[indice].esquerda = -1;
arvore[indice].direita = -1;
indice++;
break;
case R:
arvore[indice].dado = dado;
arvore[indice].pai = -1;
arvore[indice].esquerda = -1;
arvore[indice].direita = -1;
indice++;
break;
}
}
//Desenha o menu na tela
void menu_mostrar(void) {
system("clear");
for (int i = 0; i < indice; i++) {
printf("| %c ",arvore[i].dado);
}
printf("\n1 - Inserir um NO na arvore");
printf("\n2 - Pesquisar um NO na arvore");
printf("\n3 - Imprimir o percurso pré-ordem da Arvore Binaria");
printf("\n0 - Sair...\n\n");
}
//Procura nó
int arvore_procura(char dado) {
if(indice != 0){
for(int i = 0; i < indice; i++) {
if (arvore[i].dado == dado) {
return i;
}
}
}
return 0;
}
void preOrdem(struct str_no* raiz){
if(raiz->dado != -1){
printf("\n%c",raiz->dado);
preOrdem(&arvore[arvore_procura(raiz->esquerda+'0')]);
preOrdem(&arvore[arvore_procura(raiz->direita+'0')]);
}
}
Após a inserção de alguns nodes na arvore, ao executar a opção 3 no menu, o preOrdem loopa infinitamente no node raiz da árvore.
Eu simplesmente não sei mais o que eu fazer.
Quem poder me dar uma luz, agradeço bastante.