Guest User

Untitled

a guest
Jul 17th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*
  5. ESTRUTURA DA ARVORE
  6. */
  7. typedef struct no {
  8. int conteudo;
  9. struct no *esq,
  10. *dir;
  11. }Arvore;
  12. // FIM
  13.  
  14.  
  15.  
  16.  
  17.  
  18. /*
  19. CASE '1' -> INSERÇÃO NA ARVORE
  20. */
  21.  
  22. Arvore *insereNaArvore(Arvore *raiz, Arvore *r, int conteudo){
  23. if (!r) {//VERIFICA SE r É NULL, SE FOR ALOCA, ESQ E DIR = NULL, RECEBE
  24. r = (Arvore *)malloc(sizeof(Arvore)); // CONTEUDO
  25. if (!r) {//TESTA SE ALOCOU O r
  26. printf("\n\n\nSEM MEMORIA!!");
  27. exit(0);
  28. }
  29. r->esq = NULL;
  30. r->dir = NULL;
  31. r->conteudo = conteudo;
  32.  
  33. if (!raiz) {
  34. return r; //PRIMEIRA ENTRADA, ARVORE ASSUME O VALOR DE r
  35. }
  36.  
  37. if (conteudo == raiz->conteudo) {//VERICA SE JA É CADASTRADO
  38. printf("\n\n\n\n\nNUMERO %d JA CADASTRADO.",raiz->conteudo);
  39. return ;
  40. }
  41. if(conteudo < raiz->conteudo){//SE O CONTEUDO FOR MENOR, ASSUME VALOR DA
  42. raiz->esq = r; //ESQUERDA */
  43. printf("\n\n\n\n\nNUMERO CADASTRADO: %d",r->conteudo);//INFORMA NUMERO
  44. }
  45. else{
  46. raiz->dir = r;//SE MAIOR, ASSUME DA DIREITA
  47. printf("\n\n\n\n\nNUMERO CADASTRADO: %d",r->conteudo);//INFORMA NUMERO
  48. }
  49.  
  50. getch();
  51. return r; //APENAS VOLTA PARA A FUNCAO
  52. }
  53. if (conteudo == r->conteudo){//VERIFICA SE JA FOI CADASTRADO
  54. printf("\n\n\nNUMERO %d JA CADASTRADO.",raiz->conteudo);
  55. getch();
  56. return ;
  57. }
  58. else if (conteudo < r->conteudo){//NUMERO MENOR, VAI PRA ESQUERDA
  59. printf("\n\n<-- FOI PRA ESQUERDA");
  60. insereNaArvore(r, r->esq, conteudo);
  61. }
  62. else{ //NUMERO MAIOR, VAI PRA DIREITA
  63. printf("\n\nFOI PRA DIREITA -->"); //NUMERO MAIOR, VAI PRA DIREITA
  64. insereNaArvore(r, r->dir, conteudo);
  65. }
  66. }
  67. // FIM
  68.  
  69.  
  70.  
  71.  
  72.  
  73. /*
  74. CASE '2' -> MOSTRAR A ARVORE
  75. */
  76. Arvore *imprimiArvore(Arvore *raiz, int l){
  77. int i;
  78. if(!raiz)//SE RAIZ = NULA, RETORNA
  79. return;
  80.  
  81. imprimiArvore(raiz->dir,l+1);//IMPRIMI À DIREITA
  82.  
  83. for(i=0 ; i<l ;i++)//FUNCAO PARA FAZER A IMPRESSAO CORRETA EM ARVORE
  84. printf(" ");
  85.  
  86. printf("%d\n",raiz->conteudo);
  87.  
  88. imprimiArvore(raiz->esq,l+1);//IMPRIMI À ESQUERDA
  89. }
  90.  
  91.  
  92.  
  93.  
  94.  
  95. /*
  96. CASE '3' -> REMOVER ARQUIVOS
  97. */
  98. Arvore *deletaArvore(Arvore *raiz, int conteudo) {
  99. Arvore *p, *p2;
  100.  
  101. if (!raiz) //RAIZ = NULA, QUER DIZER QUE TA VAZIA
  102. return raiz;
  103.  
  104. if ( raiz->conteudo%conteudo == 0) { //SE O RESTO DA DIVISAO DO NÓ PELO
  105. //CONTEUDO FOR 0, É MULTIPLO ENTAO DELETA
  106. printf("\n\n\nNUMERO %d DELETADO.",raiz->conteudo);
  107. getch();
  108. if (raiz->esq == raiz->dir){ //RAIZ NULA
  109. free(raiz);
  110. return NULL;
  111. }
  112.  
  113. else if (raiz->esq == NULL){ //ou se uma subarvore eh nula
  114. p = raiz->dir;
  115. free(raiz);
  116. return p;
  117. }
  118.  
  119. else if (raiz->dir == NULL){
  120. p = raiz->esq;
  121. free(raiz);
  122. return p;
  123. }
  124.  
  125. else{ //ou as duas subarvores estao presentes
  126. p2 = raiz->dir;
  127. p = raiz->dir;
  128. while (p->esq)
  129. p = p->esq;
  130. p->esq = raiz->esq;
  131. free(raiz);
  132. return p2;
  133. }
  134. }
  135. //VERIFICA SE É MAIOR OU MENOR
  136. if (raiz->conteudo < conteudo) //VAI PRA DIREITA OU ESQUERDA
  137. raiz->dir = deletaArvore(raiz->dir, conteudo);
  138. else raiz->esq = deletaArvore(raiz->esq, conteudo);
  139.  
  140. return raiz;
  141. }
  142.  
  143.  
  144.  
  145.  
  146.  
  147. /*
  148. FUNCAO PRINCIPAL
  149. */
  150. main(){
  151. int quantidade, conteudo,i;
  152. char op;
  153.  
  154. srand(time(NULL));
  155.  
  156. Arvore *arvore,*arvoreB; //CRIA UMA VARIAVEL ARVORE
  157. arvore = NULL; //DEIXA INICIALMENTE NULA
  158.  
  159. do{ //MENU
  160. system("cls");
  161. printf("\t\t\t ______________________");
  162. printf("\n\t\t\t| MENU DE ARVORES: |");
  163. printf("\n\t\t\t ______________________");
  164. printf("\n\t\t\t|1| GERAR ARVORE |");
  165. printf("\n\t\t\t|2| MOSTRAR |");
  166. printf("\n\t\t\t|3| REMOVER |");
  167. printf("\n\t\t\t|0| SAIR |");
  168. printf("\n\t\t\t ----------------------");
  169. printf("\n\n\t\t\tOpcao: ");
  170. op = getchar(); //RECEBE OPCAO
  171. fflush(stdin);
  172. switch(op){
  173.  
  174. case '1':
  175. system("cls");
  176. printf("\n\t\t\tGERANDO ARVORE RANDOMICAMENTE:");
  177. printf("\n\n\n\nDIGITE A QUANTIA DE NOS(1 a 100): ");
  178. scanf("%d",&quantidade);
  179. fflush(stdin);
  180.  
  181. if(quantidade > 100 || quantidade < 1){ //TESTA SE TA NOS
  182. printf("\n\n\n\n\n\nNUMERO INVALIDO."); //LIMITES
  183. getch();
  184. break;
  185. }
  186.  
  187. for (i = 1; i <= quantidade; i++){ //GERANDO NUMEROS RANDOM
  188. system("cls");
  189. conteudo = rand() % 100;
  190. if (!arvore) //SE FOR A PRIMEIRA INSERÇÃO
  191. arvore = insereNaArvore(arvore, arvore, conteudo);
  192. else insereNaArvore(arvore, arvore, conteudo);
  193. }
  194.  
  195. printf("\n\n\n\n\n\nARVORE GERADA COM SUCESSO!!\n");
  196.  
  197. getchar();
  198. break;
  199.  
  200.  
  201. case '2':
  202. printf("\n\nIMPRIMINDO A ARVORE\n\n");
  203.  
  204. if(arvore)//SE EXISTIR, MOSTRA
  205. imprimiArvore(arvore,0);
  206. else printf("\n\nARVORE NULA");//SE NAO, INFORMA QUE TA NULA
  207.  
  208. getch();
  209. break;
  210.  
  211.  
  212. case '3':
  213. printf("\n\nREMOVENDO ITENS DA ARVORE\n\n");
  214.  
  215. if (!arvore)
  216. printf("\n\nARVORE NULA");//INFORMA QUE TA NULA
  217. else {
  218. printf("DIGITE UM NUMERO: ");//RECEBE O NUMERO A SER
  219. scanf("%d", &conteudo); //VERIFICADO PARA DELETAR
  220. fflush(stdin);
  221. while(arvore != arvoreB){
  222. arvoreB = arvore;
  223. arvore = deletaArvore(arvore,conteudo);
  224. }
  225. }
  226.  
  227. getchar();
  228. break;
  229.  
  230.  
  231. case '0': // SAIR DO PROGRAMA
  232. break;
  233. }
  234. }while(op!='0');
  235. }
Add Comment
Please, Sign In to add comment