antunesz 0 Denunciar post Postado Outubro 25, 2014 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
LazaroBinda 3 Denunciar post Postado Outubro 26, 2014 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