Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

antunesz

Criar organograma com arvore binaria

Recommended Posts

Ola pessoal, estou fazendo um trabalho para a faculdade mas estou com certa dificuldade.

 

Preciso construir um programa em C para gerenciar o organograma de uma empresa utilizando árvores binárias.

Cada nodo da árvore terá as informações do cargo e dois ponteiros: um ponteiro para os cargos filhos (cargos subordinados) e outro ponteiro para os cargos irmãos (na mesma linha no staff da empresa).

 

O programa deverá já criar o nodo raiz que terá a função/cargo de Presidente.

Para adição de novos cargos/funções o programa deverá perguntar: o nome e salário do novo cargo e a qual função este cargo deve ser subordinado (cargo pai deste novo cargo).

 

O sistema deverá procurar na árvore o cargo-pai e se localizar incluir o novo cargo como filho deste. Se o cargo-pai já tiver filhos, o novo cargo deve ser adicionado como irmão deste filho.

 

o meu codigo está assim..

 

CODE:

 

//Operações sobre árvore de busca binária
#include<stdio.h>
#include<stdlib.h>
//Definição da árvore
typedef struct nodo{
char info[30];
struct nodo * esquerda;
struct nodo * direita;
}nodo;
//Criação de um nodo da arvore
nodo * cria_elemento(char info){
nodo * novo = malloc(sizeof(nodo));
strcpy(novo->info, info);
novo->esquerda = NULL;
novo->direita = NULL;
return novo;
}
//Inclusão de um nodo na árvore a partir da raiz
void insere_folha(nodo ** arv, char info){
if (*arv == NULL){
*arv = cria_elemento(info);
}else{
if(strcmp(info, (*arv)->info==0)){
printf("Inserindo na Esquerda. \n");
insere_folha(&(*arv)->esquerda, info);
}else if (strcmp(info, (*arv)->info)==0){
printf("Inserindo na Direita. \n");
insere_folha(&(*arv)->direita, info);
}
}
}
//Caminhamento pre-ordem
void pre_ordem(nodo * arv){
if (arv != NULL) {
printf("%c \n",arv->info);
if (arv->esquerda != NULL){
printf("Nodo Esquerdo. \n");
pre_ordem(arv->esquerda);
}
if(arv->direita != NULL){
printf("Nodo Direito. \n");
pre_ordem(arv->direita);
}
}
}
//Caminhamento em-ordem
void em_ordem(nodo * arv){
if (arv != NULL){
if (arv->esquerda != NULL){
printf("Nodo Esquerdo. \n");
em_ordem(arv->esquerda);
}
printf("%c \n", arv->info);
if (arv->direita != NULL){
printf("Nodo Direito. \n");
em_ordem(arv->direita);
}
}
}
//Caminhamento pos-ordem
void pos_ordem(nodo * arv){
if (arv != NULL){
if (arv->esquerda != NULL){
printf("Nodo Esquerdo. \n");
pos_ordem(arv->esquerda);
}
if (arv->direita != NULL){
printf("Nodo direito. \n");
pos_ordem(arv->direita);
}
printf("%c \n", arv->info);
}
}
//Pesquisar um nodo
void pesquisar_nodo(nodo * arv, char pesq){
if (arv != NULL){
if (arv->info == pesq){
printf("Nodo encontrado %c. \n", arv->info);
}else{
if (pesq > arv->info){
printf("Pesquisando a direita. \n");
pesquisar_nodo(arv->direita, pesq);
}else{
printf("Pesquisando a esquerda. \n");
pesquisar_nodo(arv->esquerda, pesq);
}
}
}else{
printf("Nodo nao encontrado ");
}
}
int nivel_do_nodo(nodo * arv, char info){
if (arv == NULL){
return 0;
}else{
if (info < arv->info){
printf("esquerda");
return 1 + nivel_do_nodo(arv->esquerda, info);
}else if (info > arv->info){
printf("direita");
return 1 + nivel_do_nodo(arv->direita, info);
}else{
return 1;
}
}
}
//Monta o menu do programa
void monta_menu(){
printf("//////////////////////////////////////////////////////////////// \n");
printf("Operacoes sobre Arvores \n");
printf("Selecione a Opcao Desejada: \n");
printf(" 1 - Incluir Folha\n");
printf(" 2 - Caminhar Em Pre-Ordem \n");
printf(" 3 - Caminhar Em Ordem \n");
printf(" 4 - Caminhar Em Pos-Ordem \n");
printf(" 5 - Pesquisar nodos na Arvore \n");
printf(" 6 - Pesquisar nivel na Arvore \n");
printf(" 0 - Sair \n");
printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n \n");
printf("Qual a sua opcao: ");
}
void main(){
int op = 1;
int nivel = 0;
char info[] = "Presidente";
nodo * arv = NULL;
insere_folha(&arv, info);
do{
monta_menu();
scanf("%d", &op);
system("cls");
switch(op){
case 1:
while (info[0] != '9'){
printf("Informe a letra a inserir na arvore (ou 9 para sair): \n");
scanf(" %s", &info);
if (info[0] != '9'){
insere_folha(&arv, info);
}
}
break;
case 2:
pre_ordem(arv);
break;
case 3:
em_ordem(arv);
break;
case 4:
pos_ordem(arv);
break;
case 5:
printf("Informe o caractere procurado: \n");
scanf(" %s", &info);
pesquisar_nodo(arv, info);
break;
case 6:
printf("Informe o caractere do nodo a saber o nivel: \n");
scanf(" %s", &info);
nivel = nivel_do_nodo(arv, info);
if (nivel == 0){
printf("Nodo nao encontrado na arvore.\n");
}else{
printf("Nodo %c encontrado na arvore no nivel %d.\n", info, nivel-1);
}
break;
}
}while (op != 0);
}
FIM CODE
Alguem pode me dar uma mão?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,

 

O que vc já escreveu até agora contém alguns poucos erros.

 

Em primeiro lugar, fiquei um pouco confuso em entender se "info" deveria ser um char ou um array de char. Levando em consideração que esse deveria ser um array de char, seu código ficaria assim:

//Operações sobre árvore de busca binária
#include<stdio.h>
#include<stdlib.h>
#include <string.h>


//Definição da árvore
typedef struct nodo{
  char info[30];
  struct nodo *esquerda;
  struct nodo *direita;
}nodo;

//Criação de um nodo da arvore
nodo * cria_elemento(char *info){
  nodo * novo = malloc(sizeof(nodo));
  strcpy(novo->info, info);
  novo->esquerda = NULL;
  novo->direita = NULL;
  return novo;
}

//Inclusão de um nodo na árvore a partir da raiz
void insere_folha(nodo **arv, char *info){
   if (*arv == NULL){
     *arv = cria_elemento(info);
   }else{
     if(strcmp(info, (*arv)->info) == 0){
        printf("Inserindo na Esquerda. \n");
        insere_folha(&(*arv)->esquerda, info);
     }else if (strcmp(info,  (*arv)->info) == 0){
        printf("Inserindo na Direita. \n");
        insere_folha(&(*arv)->direita, info);
     }
   }
}

//Caminhamento pre-ordem
void pre_ordem(nodo * arv){
  if (arv != NULL) {
     printf("%s \n", arv->info);
     if (arv->esquerda != NULL){
        printf("Nodo Esquerdo. \n");
        pre_ordem(arv->esquerda);
     }
     if(arv->direita != NULL){
        printf("Nodo Direito. \n");
        pre_ordem(arv->direita);
     }
  }
}

//Caminhamento em-ordem
void em_ordem(nodo * arv){
  if (arv != NULL){
     if (arv->esquerda != NULL){
       printf("Nodo Esquerdo. \n");
       em_ordem(arv->esquerda);
     }
     printf("%s \n", arv->info);
     if (arv->direita != NULL){
       printf("Nodo Direito. \n");
       em_ordem(arv->direita);
     }
  }
}

//Caminhamento pos-ordem
void pos_ordem(nodo * arv){
  if (arv != NULL){
    if (arv->esquerda != NULL){
       printf("Nodo Esquerdo. \n");
       pos_ordem(arv->esquerda);
    }
    if (arv->direita != NULL){
       printf("Nodo direito. \n");
       pos_ordem(arv->direita);
    }
    printf("%s \n", arv->info);
  }
}

//Pesquisar um nodo
void pesquisar_nodo(nodo * arv, char *pesq){
  if (arv != NULL){
     if (arv->info == pesq){
        printf("Nodo encontrado %s. \n", arv->info);
     }else{
       if (pesq > arv->info){
          printf("Pesquisando a direita. \n");
          pesquisar_nodo(arv->direita, pesq);
       }else{
          printf("Pesquisando a esquerda. \n");
          pesquisar_nodo(arv->esquerda, pesq);
       }
     }
  }else{
    printf("Nodo nao encontrado ");
  }
}

int nivel_do_nodo(nodo * arv, char *info){
if (arv == NULL){
    return 0;
}else{
  if (strcmp(info, arv->info) < 0){
      printf("esquerda");
   return 1 + nivel_do_nodo(arv->esquerda, info);
  }else if (strcmp(info, arv->info) > 0){
      printf("direita");
    return 1 + nivel_do_nodo(arv->direita, info);
  }else{
    return 1;
  }
}
}

//Monta o menu do programa
void monta_menu(){

   printf("//////////////////////////////////////////////////////////////// \n");
   printf("Operacoes sobre Arvores \n");
   printf("Selecione a Opcao Desejada: \n");
   printf("   1 - Incluir Folha\n");
   printf("   2 - Caminhar Em Pre-Ordem \n");
   printf("   3 - Caminhar Em Ordem \n");
   printf("   4 - Caminhar Em Pos-Ordem \n");
   printf("   5 - Pesquisar nodos na Arvore \n");
   printf("   6 - Pesquisar nivel na Arvore \n");
   printf("   0 - Sair \n");
   printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n \n");
   printf("Qual a sua opcao: ");
}


int main(){
  int op = 1;
  int nivel = 0;
  char info[] = "Presidente";

  nodo * arv = NULL;
  insere_folha(&arv, info);

  do{
    monta_menu();
    scanf("%d", &op);
    system("cls");



    switch(op){
       case 1:
          while (info[0] != '9'){
            printf("Informe a letra a inserir na arvore (ou 9 para sair): \n");
            scanf(" %s", info);
            if (info[0] != '9'){
             insere_folha(&arv, info);
            }
          }
          break;
       case 2:
          pre_ordem(arv);
          break;
       case 3:
          em_ordem(arv);
          break;
        case 4:
          pos_ordem(arv);
          break;
        case 5:
           printf("Informe o caractere procurado: \n");
          scanf(" %s", info);
          pesquisar_nodo(arv, info);
          break;

        case 6:
          printf("Informe o caractere do nodo a saber o nivel: \n");
          scanf(" %s", info);
          nivel = nivel_do_nodo(arv, info);
          if (nivel == 0){
             printf("Nodo nao encontrado na arvore.\n");
          }else{
             printf("Nodo %s encontrado na arvore no nivel %d.\n", info, nivel-1);
          }
          break;

    }
  }while (op != 0);

  return 0;
}

Verifica aí se é isso mesmo e tenta terminar o código.

 

Estamos à disposição caso precise de ajuda.

Mas seria interessante vc tentar completá-lo sozinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.