Advertisement
Jonas_3k

/*-Comentários na árvore do Omega-*/

Dec 3rd, 2012
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.36 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct A
  5. {
  6.     int elemento;
  7.     struct A *esq,*dir;
  8.  
  9. }arvore;
  10.  
  11. void adicionar_Elemento(arvore*, int);
  12. void Imprimir(arvore*);
  13. int  Pesquisar(arvore*, int);
  14.  
  15. int main(void)
  16. {
  17.     char opc;
  18.     int elem_raiz, n, buf, pes;
  19.     arvore *raiz;
  20.     printf("Digite um numero para a raiz: "); // Este trecho poderia ter sido removido, para aproveitar mais uma célula na árvore.
  21.     scanf(" %d", &elem_raiz);
  22.     raiz = (arvore*)malloc(sizeof(arvore));
  23.     raiz->elemento = elem_raiz;
  24.     raiz->esq = NULL;
  25.     raiz->dir = NULL;
  26.  
  27.         do{
  28.            printf("\n\nO que deseja fazer?\n\
  29.            A - Adicionar\n\
  30.            L - Listar\n\
  31.            P - Pesquisar\n\
  32.            S - Sair\n");
  33.            printf("\nOpcao escolhida: ");
  34.                while ((buf = getchar()) != '\n' && buf != EOF); // isso aqui é mais uma das viadagens do Omega.
  35.            scanf("%c", &opc);
  36.  
  37.            switch(opc)
  38.            {
  39.               case 'a': printf("\nDigite um inteiro: ");
  40.                             scanf(" %d",&n);
  41.                                 adicionar_Elemento(raiz, n);
  42.                     break;
  43.  
  44.               case 'l': printf("\n\n");
  45.                     Imprimir(raiz);
  46.                         break;
  47.  
  48.               case 'p': printf("\nQual elemento a procurar? ");
  49.                         scanf(" %d",&n);
  50.                 pes = Pesquisar(raiz, n);
  51.                 if(pes) printf("\nElemento encontrado.\n");
  52.                 else printf("\nElemento nao encontrado.\n");
  53.                 break;
  54.            }
  55.         }while(opc != 's');
  56.  
  57.     return 0;
  58. }
  59.  
  60. /* Função de adição, acionada para criar um novo valor
  61.  * do tipo árvore para ser colocado no ponteiro *esquerda ou no *direita.
  62.  */
  63.  
  64. void adicionar_Elemento(arvore *root, int n)
  65. {
  66.          arvore *no;
  67.     // Opa, vamos noque interessa, essa porcaria é muito fácil.
  68.      if(n < root->elemento)
  69.      {
  70.             if(root->esq == NULL)
  71.         {
  72.                no = (arvore*)malloc(sizeof(arvore));
  73.                    no->elemento = n;
  74.                    no->esq = NULL;
  75.                    no->dir = NULL;
  76.                root->esq = no;
  77.         }
  78.         else
  79.                adicionar_Elemento(root->esq, n);
  80.      }
  81.     /* O trecho acima verifica se *esq é nulo, caso contrário o trecho passa o próximo
  82.      * valor *esq para a função, mas isso só acontece se o valor for menor que o contido em "raiz"
  83.      * caso contrário o else indicando para *dir é acionado.
  84.      *
  85.      */
  86.  
  87.  
  88.      else
  89.      {
  90.         if(root->dir == NULL)
  91.         {
  92.                no = (arvore*)malloc(sizeof(arvore));
  93.                        no->elemento = n;
  94.                    no->esq = NULL;
  95.                        no->dir = NULL;
  96.                root->dir = no;
  97.         }
  98.         else
  99.                adicionar_Elemento(root->dir, n);
  100.      }
  101.  
  102.     /* Só para exercitar.
  103.  
  104.     se o novo numero for menor que o contido em raiz
  105.         e se raiz.esquerda for nulo
  106.         {
  107.             eu crio um novo valor árvore
  108.             adiciono o novo numero em novo_valor.elemento
  109.             adiciono novo_valor em raiz.esquerda
  110.             e finalizo a função.
  111.         }
  112.  
  113.         caso raiz.esquerda esteja ocupado
  114.             passo o valor raiz.esquerda para a função até que algum esquerda esteja vazio.
  115.  
  116.  
  117.     agora se o novo valor for maior que o contido em raiz
  118.         e se raiz.direita for nulo
  119.         {
  120.             eu crio um novo valor árvore
  121.             adiciono o novo número em novo_valor.elemento
  122.             adiciono novo_valoro em raiz.direita
  123.             e finalizo a função.
  124.         }
  125.  
  126.         caso raiz.direita esteja ocupado
  127.             eu passo raiz.direita para a função até que algum direita esteja vazio.
  128.  
  129.  
  130.     */
  131. }
  132.  
  133. /*
  134.  *Apesar de ser  pequena, está é a função do capeta!. Dá loop infinito na mente.
  135.  */
  136.  
  137. void Imprimir(arvore *root)
  138. {
  139.     if(root) //se o valor recebido não for nulo a função executa este trecho.
  140.     {
  141.            Imprimir(root->esq); // Entrega o ponteiro da esquerda até que seja nulo
  142.            printf("%d\n", root->elemento); // agora, como chega aqui e
  143.            Imprimir(root->dir); // como chega aqui, sempre será um mistério :P .
  144.     }
  145. }
  146.  
  147. int Pesquisar(arvore *root, int n)
  148. {
  149.     if(root) // Primeiro verifica se o ponteiro é válido, se for, executa o trecho abaixo.
  150.     {
  151.            if(root->elemento == n) // fudeu.
  152.               return 1;
  153.            else
  154.            {
  155.               if(n < root->elemento)
  156.                      return (Pesquisar(root->esq, n));
  157.                   else
  158.                      return (Pesquisar(root->dir, n));
  159.            }
  160.     }
  161.     else
  162.            return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement