Advertisement
Guest User

Untitled

a guest
Apr 18th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1. /*Thiago FC Oliveira
  2.   148069
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. typedef struct arvore {
  10.  
  11.     int chave;
  12.     struct arvore *esquerda;
  13.     struct arvore *direita;
  14.  
  15. } arvore;
  16.  
  17. typedef struct node {
  18.  
  19.     arvore *data;
  20.     struct node *next;
  21.  
  22. } node;
  23.  
  24. typedef struct lista {
  25.  
  26.     int tamanho;
  27.     struct node *head;
  28.  
  29. } lista;
  30.  
  31. /*Funcao de insercao: recebe como parametros a chave a ser inserida, "a", e o endereco de memoria da raiz. A funcao eh recursiva. */
  32.  
  33. void insercao(int a, arvore ** raiz)
  34. {
  35.  
  36.     if (*raiz == NULL) {
  37.     arvore *aux = malloc(sizeof(arvore));
  38.     if (!aux) {
  39.         printf("memoria insuficiente\n");
  40.         return;
  41.  
  42.     }
  43.     aux->direita = NULL;
  44.     aux->esquerda = NULL;
  45.     aux->chave = a;
  46.     *raiz = aux;
  47.  
  48.     return;
  49.     }
  50.  
  51.     if (a < (*raiz)->chave) {
  52.     insercao(a, &(*raiz)->esquerda);
  53.     return;
  54.     }
  55.  
  56.     if (a > (*raiz)->chave) {
  57.     insercao(a, &(*raiz)->direita);
  58.     return;
  59.     }
  60. }
  61.  
  62. /*Funcao de busca: recebe como parametros a chave a ser encontrada, e a raiz. Retorna o no procurado ou NULL */
  63.  
  64. arvore *busca(int a, arvore * r)
  65. {
  66.     while (r != NULL && r->chave != a) {
  67.     if (a < r->chave) {
  68.         r = r->esquerda;
  69.     } else {
  70.         r = r->direita;
  71.     }
  72.     }
  73.     return r;           //printf("%d", r->chave);
  74.     // if(r == NULL) printf("nao pertence\n");
  75.     //else printf("pertence");
  76. }
  77.  
  78. /*As proximas duas funcoes retornam a funcao main o maximo e o minimo da arvore, ou seja, a extrema direita ou a extrema esquerda, respectivamente.*/
  79.  
  80. int minimo(arvore * r)
  81. {
  82.     while (r->esquerda != NULL) {
  83.     r = r->esquerda;
  84.     }
  85.     return r->chave;
  86. }
  87.  
  88. int maximo(arvore * r)
  89. {
  90.     while (r->direita != NULL) {
  91.     r = r->direita;
  92.     }
  93.     return r->chave;
  94. }
  95.  
  96. /*As proximas tres funcoes fazem impressoes em profundidade, em pos ordem, pre ordem e ordem*/
  97.  
  98. void posordem(arvore * r)
  99. {
  100.     if (r != NULL) {
  101.     posordem(r->esquerda);
  102.     posordem(r->direita);
  103.     printf("%d ", r->chave);
  104.     }
  105. }
  106.  
  107. void preordem(arvore * r)
  108. {
  109.     if (r != NULL) {
  110.     printf("%d ", r->chave);
  111.     preordem(r->esquerda);
  112.     preordem(r->direita);
  113.  
  114.     }
  115. }
  116.  
  117. void ordem(arvore * r)
  118. {
  119.     if (r != NULL) {
  120.     ordem(r->esquerda);
  121.     printf("%d ", r->chave);
  122.     ordem(r->direita);
  123.  
  124.     }
  125. }
  126.  
  127. /*As proximas tres funcoes auxiliam na funcao de impressao em largura. Elas emfilam e desenfilam as chaves da arvore, e tambem libera a memoria atraves
  128. de free_all*/
  129.  
  130. void enfila(lista * l, arvore * r)
  131. {
  132.     node *aux;
  133.     node *novo = malloc(sizeof(node));
  134.     novo->data = r;
  135.     novo->next = NULL;
  136.  
  137.     aux = l->head;
  138.  
  139.     if (aux->next == NULL)
  140.     (l->head)->next = novo;
  141.     else {
  142.     while (aux->next != NULL)
  143.         aux = aux->next;
  144.     aux->next = novo;
  145.     }
  146. }
  147.  
  148. arvore *desenfila(lista * l)
  149. {
  150.     node *lixo;
  151.     node *aux = (l->head)->next;
  152.     arvore *chave;
  153.  
  154.     (l->head)->next = aux->next;
  155.     lixo = aux;
  156.     chave = lixo->data;
  157.     free(lixo);
  158.     return chave;
  159.  
  160. }
  161.  
  162. void free_all(lista * L)
  163. {
  164.  
  165.     node *aux, *aux2;
  166.  
  167.     aux = L->head->next;
  168.     aux2 = L->head;
  169.     while (aux != NULL) {
  170.  
  171.     L->head = aux->next;
  172.     free(aux);
  173.     aux = L->head;
  174.  
  175.     }
  176.     L->head = aux2;
  177.     aux2->next = NULL;
  178. }
  179.  
  180. /*Funcao que faz impressao em largura na arvore*/
  181.  
  182. void largura(arvore * r)
  183. {
  184.     lista *f = malloc(sizeof(lista));
  185.     f->tamanho = 0;
  186.     f->head = malloc(sizeof(node));
  187.     f->head->next = NULL;
  188.  
  189.     enfila(f, r);
  190.  
  191.     while (f->head->next != NULL) {
  192.     r = desenfila(f);
  193.     printf("%d ", r->chave);
  194.     if (r->esquerda != NULL)
  195.         enfila(f, r->esquerda);
  196.     if (r->direita != NULL)
  197.         enfila(f, r->direita);
  198.  
  199.     }
  200.     free_all(f);
  201.     return;
  202. }
  203.  
  204.  
  205.  
  206.  
  207. int main()
  208. {
  209.  
  210.     arvore *a = NULL, *aux;
  211.     char comando[30];
  212.     int chave, i = 1;
  213.  
  214.     while (i != 0) {
  215.  
  216.     scanf("%s", comando);
  217.  
  218.     if (strcmp("inserir", comando) == 0) {
  219.         scanf("%d", &chave);
  220.         insercao(chave, &a);
  221.     }
  222.  
  223.     if (strcmp("buscar", comando) == 0) {
  224.         scanf("%d", &chave);
  225.         aux = busca(chave, a);
  226.         if (aux == NULL) {
  227.         printf("nao pertence\n");
  228.         } else {
  229.         printf("pertence\n");
  230.         }
  231.     }
  232.     if (strcmp("minimo", comando) == 0) {
  233.         if (a == NULL)
  234.         printf("vazia\n");
  235.         else {
  236.         printf("%d\n", minimo(a));
  237.         }
  238.     }
  239.     if (strcmp("maximo", comando) == 0) {
  240.         if (a == NULL)
  241.         printf("vazia\n");
  242.         else {
  243.         printf("%d\n", maximo(a));
  244.         }
  245.     }
  246.     if (strcmp("pos-ordem", comando) == 0) {
  247.         if (a == NULL)
  248.         printf("vazia\n");
  249.         else {
  250.         posordem(a);
  251.         printf("\n");
  252.         }
  253.     }
  254.     if (strcmp("em-ordem", comando) == 0) {
  255.         if (a == NULL)
  256.         printf("vazia\n");
  257.         else {
  258.         ordem(a);
  259.         printf("\n");
  260.         }
  261.     }
  262.     if (strcmp("pre-ordem", comando) == 0) {
  263.         if (a == NULL)
  264.         printf("vazia\n");
  265.         else {
  266.         preordem(a);
  267.         printf("\n");
  268.         }
  269.     }
  270.     if (strcmp("largura", comando) == 0) {
  271.         if (a == NULL)
  272.         printf("vazia\n");
  273.         else {
  274.         largura(a);
  275.         printf("\n");
  276.         }
  277.     }
  278.     if (strcmp("terminar", comando) == 0) {
  279.         i = 0;
  280.     }
  281.     }
  282.     return 0;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement