tomasfdel

Estructuras I Práctica 4

May 18th, 2017
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 26.44 KB | None | 0 0
  1. ///EJERCICIO 1
  2. /*
  3. 1 - C D
  4. 2 - A B C D
  5. 3 - B C D
  6. 4 - E  
  7. */
  8.  
  9.  
  10. ///EJERCICIOS 3 AL 7
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14.  
  15. typedef enum {
  16.   BTREE_RECORRIDO_IN,
  17.   BTREE_RECORRIDO_PRE,
  18.   BTREE_RECORRIDO_POST
  19. } BTreeOrdenDeRecorrido;
  20.  
  21. typedef struct _BTNodo {
  22.   int dato;
  23.   struct _BTNodo *left;
  24.   struct _BTNodo *right;
  25. } BTNodo;
  26.  
  27. typedef BTNodo *BTree;
  28.  
  29. ///INICIO DE COSAS AUXILIARES
  30.  
  31. static void imprimir_entero(int data) {
  32.   printf("%d ", data);
  33. }
  34.  
  35. int maximo (int a, int b){
  36.     return (a > b)? a : b;
  37. }
  38.  
  39. typedef struct _Cola {
  40.     BTree puntero;
  41.     struct _Cola *anterior, *siguiente;
  42. } *Cola;
  43.  
  44. Cola cola_new(){
  45.     return NULL;
  46. }
  47.  
  48. int cola_is_empty (Cola cola){
  49.     return (cola == NULL)? 1 : 0;
  50. }
  51.  
  52. BTree cola_front (Cola cola){
  53.     return cola -> puntero;
  54. }
  55.  
  56. Cola cola_enqueue (Cola cola, BTree dato){
  57.     Cola nuevoNodo = (Cola) malloc (sizeof(struct _Cola));
  58.     nuevoNodo -> puntero = dato;
  59.  
  60.     if (cola == NULL){
  61.         nuevoNodo -> siguiente = nuevoNodo -> anterior = nuevoNodo;
  62.         return nuevoNodo;
  63.     }
  64.  
  65.     nuevoNodo -> siguiente = cola;
  66.     nuevoNodo -> anterior = cola -> anterior;
  67.     cola -> anterior -> siguiente = nuevoNodo;
  68.     cola -> anterior = nuevoNodo;
  69.     return cola;
  70. }
  71.  
  72. Cola cola_dequeue (Cola cola){
  73.     if(cola == NULL)
  74.         return NULL;
  75.  
  76.     if (cola -> siguiente == cola){
  77.         free(cola);
  78.         return NULL;
  79.     }
  80.  
  81.     cola -> siguiente -> anterior = cola -> anterior;
  82.     cola -> anterior -> siguiente = cola -> siguiente;
  83.  
  84.     Cola aux = cola -> siguiente;
  85.     free(cola);
  86.     return aux;
  87. }
  88.  
  89. void swap (BTree* left, BTree* right){
  90.   BTree auxiliar = *left ;
  91.   *left = *right;
  92.   *right = auxiliar;
  93. }
  94.  
  95. void btree_suma_extra_aux(int dato, int* acumulador){
  96.     (*acumulador) += dato;
  97. }
  98.  
  99. void btree_cantNodos_extra_aux(int dato, int* acumulador){
  100.     (*acumulador)++;
  101. }
  102.  
  103. ///FIN DE COSAS AUXILIARES
  104.  
  105.  
  106.  
  107.  
  108. BTree btree_crear() {
  109.   return NULL;
  110. }
  111.  
  112. void btree_destruir(BTree nodo) {
  113.   if (nodo != NULL) {
  114.     btree_destruir(nodo->left);
  115.     btree_destruir(nodo->right);
  116.     free(nodo);
  117.   }
  118. }
  119.  
  120. BTree btree_unir(int dato, BTree left, BTree right) {
  121.   BTree nuevoNodo = malloc(sizeof(BTNodo));
  122.   nuevoNodo->dato = dato;
  123.   nuevoNodo->left = left;
  124.   nuevoNodo->right = right;
  125.   return nuevoNodo;
  126. }
  127.  
  128. int btree_suma (BTree arbol){
  129.     return (arbol != NULL) ? arbol -> dato + btree_suma(arbol -> left) + btree_suma(arbol -> right) : 0;
  130. }
  131.  
  132. int btree_cantNodos (BTree arbol){
  133.     return (arbol != NULL) ? 1 + btree_cantNodos(arbol -> left) + btree_cantNodos(arbol -> right) : 0;
  134. }
  135.  
  136. int btree_altura (BTree arbol){
  137.     return (arbol != NULL) ? 1 + maximo(btree_altura(arbol -> left), btree_altura(arbol -> right)) : 0;
  138. }
  139.  
  140. void btree_recorrer(BTree arbol, BTreeOrdenDeRecorrido orden, void (*FuncionVisitante) (int) ){
  141.     if (arbol != NULL){
  142.         if (orden == BTREE_RECORRIDO_PRE){
  143.             FuncionVisitante(arbol -> dato);
  144.             btree_recorrer(arbol -> left, orden, FuncionVisitante);
  145.             btree_recorrer(arbol -> right, orden, FuncionVisitante);
  146.         }
  147.  
  148.         if (orden == BTREE_RECORRIDO_IN){
  149.             btree_recorrer(arbol -> left, orden, FuncionVisitante);
  150.             FuncionVisitante(arbol -> dato);
  151.             btree_recorrer(arbol -> right, orden, FuncionVisitante);
  152.         }
  153.  
  154.         if (orden == BTREE_RECORRIDO_POST){
  155.             btree_recorrer(arbol -> left, orden, FuncionVisitante);
  156.             btree_recorrer(arbol -> right, orden, FuncionVisitante);
  157.             FuncionVisitante(arbol -> dato);
  158.         }
  159.     }
  160. }
  161.  
  162. void btree_recorrer_extra(BTree arbol, void (*FuncionVisitanteExtra) (int, void*) , void *extra){
  163.     if(arbol != NULL){
  164.         FuncionVisitanteExtra(arbol -> dato, extra);
  165.         btree_recorrer_extra(arbol -> left, FuncionVisitanteExtra, extra);
  166.         btree_recorrer_extra(arbol -> right, FuncionVisitanteExtra, extra);
  167.     }
  168. }
  169.  
  170. int btree_suma_extra(BTree arbol){
  171.     int resultado = 0;
  172.     btree_recorrer_extra(arbol, btree_suma_extra_aux, &resultado);
  173.     return resultado;
  174. }
  175.  
  176. int btree_cantNodos_extra(BTree arbol){
  177.     int cantidad = 0;
  178.     btree_recorrer_extra(arbol, btree_cantNodos_extra_aux, &cantidad);
  179.     return cantidad;
  180. }
  181.  
  182. ///btree_altura() no se puede hacer con estructura de función
  183.  
  184. void btree_recorrer_bfs(BTree arbol, void (*FuncionVisitante) (int) ){
  185.     Cola queue = cola_new();
  186.     queue = cola_enqueue(queue, arbol);
  187.     BTree auxiliar = cola_front(queue);
  188.     while(cola_is_empty(queue) == 0){
  189.       auxiliar = cola_front(queue);
  190.       queue = cola_dequeue(queue);
  191.         if (auxiliar != NULL){
  192.             FuncionVisitante(auxiliar -> dato);
  193.             queue = cola_enqueue(queue, auxiliar -> left);
  194.             queue = cola_enqueue(queue, auxiliar -> right);
  195.         }
  196.     }
  197. }
  198.  
  199. void btree_mirror (BTree arbol){
  200.   if (arbol != NULL){
  201.     swap( &(arbol -> left) , &(arbol -> right) );
  202.     btree_mirror (arbol -> left);
  203.     btree_mirror (arbol -> right);
  204.   }
  205. }
  206.  
  207.  
  208.  
  209. int main() {
  210.   BTree ll = btree_unir(1, btree_crear(), btree_crear());
  211.   BTree l = btree_unir(2, ll, btree_crear());
  212.   BTree r = btree_unir(3, btree_crear(), btree_crear());
  213.   BTree raiz = btree_unir(4, l, r);
  214.  
  215.   printf("Preorder: ");btree_recorrer(raiz, BTREE_RECORRIDO_PRE, imprimir_entero);
  216.   printf("\nInorder: ");btree_recorrer(raiz, BTREE_RECORRIDO_IN, imprimir_entero);
  217.   printf("\nPostorder: ");btree_recorrer(raiz, BTREE_RECORRIDO_POST, imprimir_entero);
  218.   printf("\nBFS: ");btree_recorrer_bfs(raiz, imprimir_entero);
  219.  
  220.  
  221.   printf("\n\n\nSuma: %d\nCantidad:%d\nAltura:%d\n", btree_suma(raiz), btree_cantNodos(raiz), btree_altura(raiz));
  222.   printf("\n\nAhora usando la funcion recorrer_extra(). \n");
  223.   printf("Suma: %d\nCantidad:%d\n", btree_suma_extra(raiz), btree_cantNodos_extra(raiz));
  224.  
  225.  
  226.   btree_mirror(raiz);
  227.   printf("\nBFS: ");btree_recorrer_bfs(raiz, imprimir_entero);
  228.  
  229.  
  230.   btree_destruir(raiz);
  231.  
  232.   return 0;
  233. }
  234.  
  235.  
  236.  
  237.  
  238. ///EJERCICIO 8
  239.  
  240. #include <stdio.h>
  241. #include <stdlib.h>
  242. #define MAX_TREE 128
  243.  
  244. typedef struct Tree{
  245.   int datos[MAX_TREE];
  246.   int nelems;
  247. } *CBTree;
  248. ///Tienen 127 nodos, arranco a contar en datos[1];
  249.  
  250.  
  251.  
  252. ///Cosillas auxiliares
  253. typedef struct _SNodo {
  254.   int dato;
  255.   struct _SNodo *sig;
  256. } SNodo;
  257.  
  258. typedef SNodo *SList;
  259. typedef SList Pila;
  260.  
  261.  
  262. Pila pila_new() {
  263.   return NULL;
  264. }
  265.  
  266. int pila_is_empty(Pila pila) {
  267.   return pila == NULL;
  268. }
  269.  
  270. int pila_top (Pila pila){
  271.     return pila -> dato;
  272. }
  273.  
  274. Pila pila_push(Pila pila, int dato) {
  275.   Pila nuevoNodo = malloc(sizeof(SNodo));
  276.   nuevoNodo -> dato = dato;
  277.   nuevoNodo -> sig = pila;
  278.   return nuevoNodo;
  279. }
  280.  
  281. Pila pila_pop(Pila pila){
  282.     if(pila != NULL){
  283.         Pila aEliminar = pila;
  284.         pila = pila -> sig;
  285.         free(aEliminar);
  286.     }
  287.     return pila;
  288. }
  289.  
  290. void imprimir_entero (int entero){
  291.   printf("%d  ", entero);
  292. }
  293.  
  294. ///Fin de cosillas auxiliares
  295.  
  296. CBTree cbtree_crear(){
  297.     CBTree nuevo = (CBTree) malloc (sizeof(struct Tree));
  298.     nuevo -> nelems = 0;
  299.     return nuevo;
  300. }
  301.  
  302. void cbtree_destruir(CBTree arbol){
  303.     free(arbol);
  304. }
  305.  
  306. int cbtree_nelementos(CBTree arbol){
  307.   return arbol -> nelems;
  308. }
  309.  
  310. void cbtree_insertar(CBTree arbol, int dato){
  311.     if (cbtree_nelementos(arbol) < MAX_TREE - 1){
  312.       arbol -> nelems ++;
  313.       arbol -> datos[arbol -> nelems] = dato;
  314.     }
  315. }
  316.  
  317.  
  318. ///Recorre en inorder.
  319. void cbtree_recorrer (CBTree arbol, void (*FuncionVisitante) (int) ){
  320.   int auxiliar, flag = 0;
  321.   Pila stack = pila_new();
  322.   stack = pila_push(stack, 1);
  323.   if(cbtree_nelementos(arbol) > 0){
  324.     while( ! pila_is_empty(stack) ){
  325.       auxiliar = pila_top(stack);
  326.       stack = pila_pop(stack);
  327.       if (auxiliar != -1){
  328.         if(flag)
  329.           FuncionVisitante(arbol -> datos [auxiliar]);
  330.         else{
  331.           if ( auxiliar * 2 + 1 <= cbtree_nelementos(arbol))
  332.             stack = pila_push (stack, auxiliar * 2 + 1);
  333.           else
  334.             stack = pila_push (stack, -1);
  335.          
  336.           stack = pila_push (stack, auxiliar);
  337.          
  338.           if ( auxiliar * 2 <= cbtree_nelementos(arbol))
  339.             stack = pila_push (stack, auxiliar * 2);
  340.           else
  341.             stack = pila_push (stack, -1);
  342.         }
  343.         flag = 0;
  344.       }
  345.      
  346.       else flag = 1;
  347.     }    
  348.   }
  349. }
  350.  
  351. void cbtree_recorrer_bfs (CBTree arbol, void (*FuncionVisitante) (int) ){
  352.   int elementos = cbtree_nelementos(arbol);
  353.   for(int i = 1; i <= elementos; i++)
  354.     FuncionVisitante(arbol->datos[i]);
  355. }
  356.  
  357.  
  358. int main() {
  359.   CBTree arbol = cbtree_crear();
  360.   (cbtree_nelementos(arbol) == 0) ? printf("Arranca vacio \n\n") : printf("Error \n\n");
  361.  
  362.   for (int i = 1; i <= 8; i++)
  363.     cbtree_insertar(arbol, i);
  364.    
  365.   cbtree_recorrer(arbol, imprimir_entero);
  366.   printf("\n\n");
  367.  
  368.   cbtree_recorrer_bfs(arbol, imprimir_entero);
  369.   printf("\n\n");
  370.  
  371.   cbtree_destruir(arbol);
  372.   return 0;
  373. }
  374.  
  375.  
  376.  
  377.  
  378.  
  379. ///EJERCICIOS 9 AL 13
  380.  
  381. #include <stdio.h>
  382. #include <stdlib.h>
  383.  
  384. typedef struct _BTNodo {
  385.   int dato;
  386.   struct _BTNodo *left;
  387.   struct _BTNodo *right;
  388. } *BSTree;
  389. ///Criterio: Menor o igual a la izquierda. Mayor a la derecha.
  390.  
  391. int maximo (int a, int b){
  392.     return (a >= b)? a : b;
  393. }
  394.  
  395. void swap (int *a, int *b){
  396.   int aux = *a; *a = *b; *b = aux;
  397. }
  398.  
  399.  
  400.  
  401. BSTree bstree_crear(){
  402.   return NULL;
  403. }
  404.  
  405. BSTree bstree_insertar_auxiliar(BSTree arbol, BSTree nuevo){
  406.   if (arbol == NULL)
  407.     return nuevo;
  408.  
  409.   if (nuevo -> dato <= arbol -> dato)
  410.     arbol -> left = bstree_insertar_auxiliar(arbol -> left, nuevo);
  411.   else
  412.     arbol -> right = bstree_insertar_auxiliar(arbol -> right, nuevo);
  413.  
  414.   return arbol;
  415. }
  416.  
  417. BSTree bstree_insertar (BSTree arbol, int dato){
  418.   BSTree nuevo = (BSTree) malloc (sizeof(struct _BTNodo));
  419.   nuevo -> dato = dato;
  420.   nuevo -> left = nuevo -> right = NULL;
  421.   return bstree_insertar_auxiliar(arbol, nuevo);
  422. }
  423.  
  424. BSTree bstree_direccion_minimo(BSTree arbol){
  425.   BSTree auxiliar = arbol;
  426.   for(; auxiliar -> left != NULL; auxiliar = auxiliar -> left);
  427.   return auxiliar;
  428. }
  429.  
  430. BSTree bstree_eliminar (BSTree arbol, int dato){
  431.     BSTree auxiliar = arbol, padre = NULL, auxiliar2;
  432.     BSTree* puntero = NULL;
  433.     while(auxiliar != NULL && auxiliar -> dato != dato){
  434.         padre = auxiliar;
  435.         if(dato <= auxiliar -> dato){
  436.             auxiliar = auxiliar -> left;
  437.             puntero = &(padre -> left);
  438.         }
  439.         else{
  440.             auxiliar = auxiliar -> right;
  441.             puntero = &(padre -> right);
  442.         }
  443.     }
  444.  
  445.     if(auxiliar == NULL)
  446.         return arbol;
  447.  
  448.     if(auxiliar -> left == NULL){
  449.         if(auxiliar -> right == NULL){
  450.             if(padre == NULL){
  451.                 free(auxiliar);
  452.                 return NULL;
  453.             }
  454.             *puntero = NULL;
  455.             free(auxiliar);
  456.             return arbol;
  457.         }
  458.         if(padre == NULL){
  459.             auxiliar2 = auxiliar -> right;
  460.             free(auxiliar);
  461.             return auxiliar2;
  462.         }
  463.         *puntero = auxiliar -> right;
  464.         free(auxiliar);
  465.         return arbol;
  466.     }
  467.     if(auxiliar -> right == NULL){
  468.          if(padre == NULL){
  469.             auxiliar2 = auxiliar -> left;
  470.             free(auxiliar);
  471.             return auxiliar2;
  472.         }
  473.         *puntero = auxiliar -> left;
  474.         free(auxiliar);
  475.         return arbol;
  476.     }
  477.  
  478.     auxiliar2 = bstree_direccion_minimo(auxiliar -> right);
  479.     swap(&(auxiliar->dato), &(auxiliar2->dato));
  480.     if(auxiliar -> right == auxiliar2){
  481.             auxiliar->right = auxiliar2 -> right;
  482.             free(auxiliar2);
  483.             return arbol;
  484.     }
  485.     for(auxiliar = auxiliar -> right; auxiliar -> left != auxiliar2; auxiliar = auxiliar -> left);
  486.  
  487.     auxiliar -> left = auxiliar2 -> right;
  488.     free(auxiliar2);
  489.     return arbol;
  490. }
  491.  
  492. int bstree_contiene (BSTree arbol, int dato){
  493.     if(arbol == NULL)
  494.         return 0;
  495.  
  496.     if (arbol -> dato == dato)
  497.         return 1;
  498.  
  499.     if (dato < arbol -> dato)
  500.         return bstree_contiene(arbol -> left, dato);
  501.  
  502.     return bstree_contiene (arbol -> right, dato);
  503. }
  504.  
  505. int bstree_nelementos (BSTree arbol){
  506.     return (arbol != NULL)? 1 + bstree_nelementos(arbol -> left) + bstree_nelementos(arbol -> right) : 0;
  507. }
  508.  
  509. int bstree_altura (BSTree arbol){
  510.     return (arbol != NULL)? 1 + maximo(bstree_altura(arbol -> left), bstree_altura(arbol -> right)) : 0;
  511. }
  512.  
  513. void bstree_recorrer(BSTree arbol, void (*FuncionVisitante) (int) ){
  514.     if (arbol != NULL){
  515.             FuncionVisitante(arbol -> dato);
  516.             bstree_recorrer(arbol -> left, FuncionVisitante);
  517.             bstree_recorrer(arbol -> right, FuncionVisitante);
  518.         }
  519. }
  520.  
  521. ///Para imprimir en orden, se usa inorder.
  522. void bstree_imprimir(BSTree arbol){
  523.     if(arbol != NULL){
  524.         bstree_imprimir(arbol -> left);
  525.         printf("%d  ", arbol -> dato);
  526.         bstree_imprimir(arbol -> right);
  527.     }
  528. }
  529.  
  530. void lbstree_concatenar (BSTree lista, BSTree nodo){
  531.     BSTree auxiliar = lista;
  532.     for(; auxiliar -> right != NULL; auxiliar = auxiliar -> right);
  533.     auxiliar -> right = nodo;
  534. }
  535.  
  536.  
  537. BSTree bstree_listify (BSTree arbol){
  538.     if (arbol == NULL)
  539.       return NULL;
  540.  
  541.     arbol -> left = bstree_listify (arbol -> left);
  542.     arbol -> right = bstree_listify (arbol -> right);
  543.  
  544.     if (arbol -> left == NULL)
  545.       return arbol;
  546.  
  547.     lbstree_concatenar (arbol -> left, arbol);
  548.     return arbol -> left;
  549. }
  550.  
  551. BSTree lbstree_acceder (BSTree arbol, int posicion){
  552.     BSTree auxiliar = arbol;
  553.     for(int i = 0; auxiliar != NULL && i < posicion; auxiliar = auxiliar -> right, i++);
  554.     return auxiliar;
  555. }
  556.  
  557. BSTree lbstree_treeify (BSTree lista, int cant_nodos){
  558.     if(cant_nodos == 0)
  559.       return NULL;
  560.  
  561.     BSTree auxiliar = lbstree_acceder (lista, cant_nodos/2);
  562.     auxiliar -> left = lbstree_treeify(lista, cant_nodos/2);
  563.     auxiliar -> right = lbstree_treeify(auxiliar -> right, cant_nodos - cant_nodos/2 - 1);
  564.     return auxiliar;
  565. }
  566.  
  567. int bstree_check_balance (BSTree arbol){
  568.   if (arbol == NULL)
  569.     return 1;
  570.  
  571.   int diferencia = bstree_nelementos(arbol -> left) - bstree_nelementos (arbol -> right);
  572.   if(diferencia >= -1 && diferencia <= 1)
  573.     return bstree_check_balance(arbol -> left) * bstree_check_balance(arbol -> right);
  574.   return 0;
  575. }
  576.  
  577. BSTree bstree_balancear (BSTree arbol){
  578.     int cant_nodos = bstree_nelementos(arbol);
  579.     arbol = bstree_listify(arbol);
  580.     arbol = lbstree_treeify(arbol, cant_nodos);
  581.     return arbol;
  582. }
  583.  
  584. ///Supongo que el árbol no es vacío.
  585. int bstree_minimo (BSTree arbol){
  586.     BSTree auxiliar = bstree_direccion_minimo(arbol);
  587.     return auxiliar -> dato;
  588. }
  589.  
  590. ///Supongo que el árbol no es vacío y que la posición es válida.
  591. int bstree_acceder (BSTree arbol, int posicion){
  592.     int cantidad = bstree_nelementos(arbol -> left);
  593.     if(posicion == cantidad)
  594.         return arbol -> dato;
  595.  
  596.     if(posicion < cantidad)
  597.         return bstree_acceder(arbol -> left, posicion);
  598.  
  599.     return bstree_acceder(arbol->right, posicion - cantidad - 1);
  600. }
  601.  
  602.  
  603.  
  604. int main() {
  605.     BSTree arbol = bstree_crear();
  606.     printf("En esta linea no deberia haber nada mas:  ");
  607.     bstree_imprimir(arbol);
  608.  
  609.     bstree_eliminar(arbol, 1);
  610.     arbol = bstree_insertar(arbol, 1);
  611.     arbol = bstree_eliminar(arbol, 2);
  612.     arbol = bstree_eliminar(arbol, 1);
  613.     (arbol == NULL) ? printf("\n\nEl arbol esta vacio. Todo bien.\n\n") : printf("\n\nEsto no deberia pasar.\n\n");
  614.  
  615.     for(int i=0; i<20; i++)
  616.       if(i%2)
  617.         arbol = bstree_insertar(arbol, 19 - i);
  618.       else
  619.         arbol = bstree_insertar(arbol, 100 - i);
  620.  
  621.     (bstree_minimo(arbol) == 0) ? printf("Minimo funciona bien.\n\n") : printf("Error en funcion minimo.\n'n");
  622.  
  623.  
  624.     bstree_imprimir(arbol); printf("\n");
  625.     (bstree_check_balance(arbol) == 0) ? printf("El arbol no esta balanceado.\n\n\n") : printf("Ya estaba balanceado de arranque.\n");
  626.  
  627.  
  628.     for(int i = 0; i < 10; i++)
  629.         printf("El elemento en la posicion %d es %d.\n",2*i, bstree_acceder(arbol, 2*i));
  630.  
  631.        
  632.        
  633.     arbol = bstree_balancear(arbol);
  634.     printf("\n\nLuego de balancear:\n");
  635.     bstree_imprimir(arbol); printf("\n");
  636.     (bstree_check_balance(arbol) == 1) ? printf("El arbol esta balanceado.\n") : printf("Error en el balanceo.\n");
  637.  
  638.  
  639.     for(int i=0; i<20; i++)
  640.       if(i%2)
  641.         arbol = bstree_eliminar(arbol, 19 - i);
  642.       else
  643.         arbol = bstree_eliminar(arbol, 100 - i);
  644.  
  645.  
  646.     printf("Si esta linea esta vacia, eliminar anda bien: ");
  647.     bstree_imprimir(arbol); printf("\n");
  648.  
  649.  
  650.  
  651.  
  652.     return 0;
  653. }
  654.  
  655.  
  656.  
  657.  
  658. ///EJERCICIO 14
  659.  
  660. #include <stdlib.h>
  661. #include <stdio.h>
  662.  
  663. typedef struct RoseTree{
  664.     int dato;
  665.     void* hijos;
  666. }*RTree;
  667.  
  668. typedef struct _SNodo{
  669.     RTree puntero;
  670.     struct _SNodo* sig;
  671. }SNodo;
  672.  
  673. typedef SNodo* SList;
  674.  
  675. ///Cosillas auxiliares
  676.  
  677. SList slist_crear() {
  678.   return NULL;
  679. }
  680.  
  681. void slist_destruir(SList lista) {
  682.   SNodo *nodoAEliminar;
  683.   while (lista != NULL) {
  684.     nodoAEliminar = lista;
  685.     lista = lista->sig;
  686.     free(nodoAEliminar);
  687.   }
  688. }
  689.  
  690. SList slist_agregar_final(SList lista, RTree puntero) {
  691.   SNodo *nuevoNodo = malloc(sizeof(SNodo));
  692.   nuevoNodo->puntero = puntero;
  693.   nuevoNodo->sig = NULL;
  694.  
  695.   if (lista == NULL)
  696.     return nuevoNodo;
  697.  
  698.   SList nodo = lista;
  699.   for (;nodo->sig != NULL;nodo = nodo->sig);
  700.   /* ahora 'nodo' apunta al ultimo elemento en la lista */
  701.  
  702.   nodo->sig = nuevoNodo;
  703.   return lista;
  704. }
  705.  
  706. int slist_longitud (SList lista){
  707.     int contador = 0;
  708.     for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
  709.         contador++;
  710.     return contador;
  711. }
  712.  
  713. SList slist_eliminar(SList lista, int posicion) {
  714.     if (lista == NULL || slist_longitud(lista) < posicion || posicion < 0)
  715.         return lista;
  716.     SNodo* pepe;
  717.     if (posicion == 0){
  718.         pepe = lista;
  719.         lista = lista->sig;
  720.         free(pepe);
  721.         return lista;
  722.     }
  723.     int indice = 1;
  724.     SList back = lista;
  725.     for (; indice < posicion; indice++, lista = lista->sig);
  726.     pepe = lista->sig;
  727.     lista->sig = lista->sig->sig;
  728.     free(pepe);
  729.     return back;
  730. }
  731.  
  732. void* slist_acceder(SList lista, int posicion){
  733.     SList auxiliar = lista;
  734.     for(int i = 0; auxiliar != NULL && i < posicion; auxiliar = auxiliar -> sig, i++);
  735.    
  736.     if(auxiliar == NULL)
  737.         return NULL;
  738.     return auxiliar -> puntero;
  739. }
  740.  
  741. ///Fin de cosillas auxiliares
  742.  
  743. RTree rtree_crear (int dato){
  744.     RTree nuevo = (RTree) malloc (sizeof(struct RoseTree));
  745.     nuevo -> dato = dato;
  746.     nuevo -> hijos = NULL;
  747.     return nuevo;
  748. }
  749.  
  750. void rtree_insertar(RTree padre, RTree hijo){
  751.     padre -> hijos = slist_agregar_final(padre -> hijos, hijo);
  752. }
  753.  
  754. void rtree_destruir(RTree arbol){
  755.     while(arbol -> hijos != NULL){
  756.         rtree_destruir(slist_acceder(arbol -> hijos, 0));
  757.         arbol -> hijos = slist_eliminar(arbol -> hijos, 0);
  758.     }
  759.     free(arbol);
  760. }
  761.  
  762. int rtree_nelems(RTree arbol){
  763.    
  764.     if (arbol == NULL) return 0;
  765.    
  766.     int contador = 0, posicion = 0;
  767.     void* hijo;
  768.     while( (hijo = slist_acceder(arbol -> hijos, posicion)) != NULL){
  769.         contador += rtree_nelems(hijo);
  770.         posicion++;
  771.     }
  772.     return contador+1;
  773. }
  774.  
  775. int rtree_buscar(RTree arbol, int dato){
  776.     if (arbol == NULL) return 0;
  777.    
  778.     if(arbol -> dato == dato)
  779.         return 1;
  780.    
  781.     void* hijo;
  782.     int posicion = 0;
  783.     while( (hijo = slist_acceder(arbol -> hijos, posicion)) != NULL){
  784.         posicion++;
  785.         if( rtree_buscar(hijo, dato) )
  786.             return 1;
  787.     }
  788.     return 0;
  789. }
  790.  
  791. ///Elimina todas las apariciones del dato.
  792. RTree rtree_eliminar(RTree arbol, int dato){
  793.     if(arbol == NULL) return NULL;
  794.    
  795.     if(arbol -> dato == dato){
  796.         rtree_destruir(arbol);
  797.         return NULL;
  798.     }
  799.    
  800.     void* hijo;
  801.     int posicion = 0;
  802.     while( (hijo = slist_acceder(arbol -> hijos, posicion)) != NULL){
  803.         if( rtree_eliminar(hijo, dato) == NULL )
  804.             arbol -> hijos = slist_eliminar(arbol -> hijos, posicion);
  805.            
  806.         posicion++;
  807.     }
  808.     return arbol;  
  809. }
  810.  
  811. ///Imprime en "preorder";
  812. void rtree_imprimir(RTree arbol){
  813.     if (arbol != NULL){
  814.         printf("%d   ",arbol -> dato);
  815.    
  816.         void* hijo;
  817.         int posicion = 0;
  818.         while( (hijo = slist_acceder(arbol -> hijos, posicion)) != NULL){
  819.             rtree_imprimir(hijo);
  820.             posicion++;
  821.         }
  822.     }
  823. }
  824.  
  825.  
  826. int main(){
  827.     RTree A = rtree_crear(1);
  828.     RTree B = rtree_crear(2);
  829.     RTree C = rtree_crear(3);
  830.     RTree D = rtree_crear(4);
  831.     RTree E = rtree_crear(5);
  832.     RTree E2 = rtree_crear(5);
  833.     RTree F = rtree_crear(6);
  834.     RTree G = rtree_crear(7);
  835.     RTree H = rtree_crear(8);
  836.     RTree I = rtree_crear(9);
  837.     RTree J = rtree_crear(10);
  838.    
  839.     rtree_imprimir(A);printf("\n");
  840.     printf("ELementos de una hoja: %d \n\n",rtree_nelems(A));
  841.    
  842.    
  843.     rtree_insertar(B,E);
  844.     rtree_insertar(B,F);
  845.     rtree_insertar(D,G);
  846.     rtree_insertar(D,H);
  847.     rtree_insertar(D,I);
  848.     rtree_insertar(D,J);
  849.     rtree_insertar(D,E2);
  850.     rtree_insertar(A,B);
  851.     rtree_insertar(A,C);
  852.     rtree_insertar(A,D);
  853.    
  854.     rtree_imprimir(A);printf("\n");
  855.     printf("ELementos de todo el arbol: %d \n\n\n",rtree_nelems(A));
  856.    
  857.     (rtree_buscar(A,7))? printf("El 7 esta, ¡hurra!\n") : printf("El 7 no esta, ¡oh, no!\n");
  858.     (! rtree_buscar(A,-1))? printf("El -1 no esta, ¡hurra!\n") : printf("El -1 esta, wat?\n");
  859.    
  860.     A = rtree_eliminar(A,5);
  861.     printf("\n\n");rtree_imprimir(A);printf("\n");
  862.    
  863.     A = rtree_eliminar(A,1);
  864.     rtree_imprimir(A);printf("\n");
  865.    
  866.     return 0;
  867. }
  868.  
  869.  
  870.  
  871.  
  872.  
  873. ///EJERCICIO 15
  874.  
  875.  
  876. #include <stdlib.h>
  877. #include <stdio.h>
  878.  
  879. typedef struct MulTree{
  880.     int dato;
  881.     struct MulTree* hijo;
  882.     struct MulTree* hermano;
  883. } *MTree;
  884.  
  885. ///Cosillas auxiliares.
  886.  
  887. typedef struct RoseTree{
  888.     int dato;
  889.     void* hijos;
  890. }*RTree;
  891.  
  892. typedef struct _SNodo{
  893.     RTree puntero;
  894.     struct _SNodo* sig;
  895. }SNodo;
  896.  
  897. typedef SNodo* SList;
  898.  
  899. void* slist_acceder(SList lista, int posicion){
  900.     SList auxiliar = lista;
  901.     for(int i = 0; auxiliar != NULL && i < posicion; auxiliar = auxiliar -> sig, i++);
  902.    
  903.     if(auxiliar == NULL)
  904.         return NULL;
  905.     return auxiliar -> puntero;
  906. }
  907.  
  908. SList slist_agregar_final(SList lista, RTree puntero) {
  909.   SNodo *nuevoNodo = malloc(sizeof(SNodo));
  910.   nuevoNodo->puntero = puntero;
  911.   nuevoNodo->sig = NULL;
  912.  
  913.   if (lista == NULL)
  914.     return nuevoNodo;
  915.  
  916.   SList nodo = lista;
  917.   for (;nodo->sig != NULL;nodo = nodo->sig);
  918.   /* ahora 'nodo' apunta al ultimo elemento en la lista */
  919.  
  920.   nodo->sig = nuevoNodo;
  921.   return lista;
  922. }
  923.  
  924. void rtree_imprimir(RTree arbol){
  925.     if (arbol != NULL){
  926.         printf("%d   ",arbol -> dato);
  927.    
  928.         void* hijo;
  929.         int posicion = 0;
  930.         while( (hijo = slist_acceder(arbol -> hijos, posicion)) != NULL){
  931.             rtree_imprimir(hijo);
  932.             posicion++;
  933.         }
  934.     }
  935. }
  936.  
  937. RTree rtree_crear (int dato){
  938.     RTree nuevo = (RTree) malloc (sizeof(struct RoseTree));
  939.     nuevo -> dato = dato;
  940.     nuevo -> hijos = NULL;
  941.     return nuevo;
  942. }
  943.  
  944. void rtree_insertar(RTree padre, RTree hijo){
  945.     padre -> hijos = slist_agregar_final(padre -> hijos, hijo);
  946. }
  947.  
  948. void imprimir_entero(int dato){
  949.     printf("%d   ", dato);
  950. }
  951.  
  952. void contar_nodos(int dato, int* resultado){
  953.     (*resultado)++;
  954. }
  955.  
  956. void sumar_nodos(int dato, int* resultado){
  957.     *resultado+=dato;
  958. }
  959.  
  960. ///Fin de cosillas auxiliares.
  961.  
  962.  
  963. MTree mtree_crear(int dato){
  964.     MTree nuevo = (MTree) malloc(sizeof(struct MulTree));
  965.     nuevo->dato = dato;
  966.     nuevo->hijo = nuevo -> hermano = NULL;
  967.     return nuevo;
  968. }
  969.  
  970. MTree mtree_agregar_aux(MTree arbol, MTree arbolAAgregar, int posicion){
  971.     if (posicion == 0){
  972.         arbolAAgregar->hermano = arbol;
  973.         return arbolAAgregar;
  974.     }
  975.     if (arbol == NULL)
  976.         return arbolAAgregar;
  977.  
  978.     arbol->hermano = mtree_agregar_aux(arbol->hermano, arbolAAgregar, posicion-1);
  979.     return arbol;
  980. }
  981.  
  982. MTree mtree_agregar_n_hijo(MTree padre, MTree hijo, int posicion){
  983.     if (padre == NULL) return hijo;
  984.     if (hijo == NULL) return padre;
  985.  
  986.     padre->hijo = mtree_agregar_aux(padre->hijo, hijo, posicion);
  987.     return padre;
  988. }
  989.  
  990. void mtree_destruir(MTree arbol){
  991.     if (arbol != NULL){
  992.         mtree_destruir(arbol->hijo);
  993.         mtree_destruir(arbol->hermano);
  994.         free(arbol);
  995.     }
  996. }
  997.  
  998. ///Lo recorro en inorder, lo cual es una especie de postorder en el árbol general.
  999. void mtree_recorrer(MTree arbol, void (*Funcion) (int) ){
  1000.     if(arbol != NULL){
  1001.         mtree_recorrer(arbol->hijo, Funcion);
  1002.         Funcion(arbol->dato);
  1003.         mtree_recorrer(arbol->hermano, Funcion);
  1004.     }
  1005. }
  1006.  
  1007. void mtree_recorrer_extra(MTree arbol, void (*Funcion) (int, void*) , void* extra){
  1008.     if(arbol != NULL){
  1009.         mtree_recorrer_extra(arbol->hijo, Funcion, extra);
  1010.         Funcion(arbol->dato, extra);
  1011.         mtree_recorrer_extra(arbol->hermano, Funcion, extra);
  1012.     }
  1013. }
  1014.  
  1015. int mtree_cantidad(MTree arbol){
  1016.     int resultado = 0;
  1017.     mtree_recorrer_extra(arbol, contar_nodos, &resultado);
  1018.     return resultado;
  1019. }
  1020.  
  1021. int mtree_suma(MTree arbol){
  1022.     int resultado = 0;
  1023.     mtree_recorrer_extra(arbol, sumar_nodos, &resultado);
  1024.     return resultado;
  1025. }
  1026.  
  1027. MTree mtreeify (RTree arbolRosa){
  1028.     if (arbolRosa == NULL) return NULL;
  1029.    
  1030.    
  1031.     MTree nuevoNodo = mtree_crear(arbolRosa -> dato), punteroHijo;
  1032.     int i;
  1033.     void* punteroAuxiliar;
  1034.    
  1035.    
  1036.     for(i = 0, punteroAuxiliar = NULL; (punteroAuxiliar = slist_acceder(arbolRosa -> hijos, i)) != NULL; i++){
  1037.         punteroHijo = mtreeify (punteroAuxiliar);
  1038.         mtree_agregar_n_hijo(nuevoNodo, punteroHijo, i);
  1039.        
  1040.     }
  1041.     return nuevoNodo;
  1042. }
  1043.  
  1044.  
  1045. int main(){
  1046.     MTree A = mtree_crear(1);
  1047.     MTree B = mtree_crear(2);
  1048.     MTree C = mtree_crear(3);
  1049.     MTree D = mtree_crear(4);
  1050.     MTree E = mtree_crear(5);
  1051.     MTree F = mtree_crear(6);
  1052.     MTree G = mtree_crear(7);
  1053.     MTree H = mtree_crear(8);
  1054.     MTree I = mtree_crear(9);
  1055.     MTree J = mtree_crear(10);
  1056.  
  1057.     A = mtree_agregar_n_hijo(A,B,0);
  1058.     A = mtree_agregar_n_hijo(A,C,1);
  1059.     A = mtree_agregar_n_hijo(A,D,2);
  1060.     B = mtree_agregar_n_hijo(B,E,0);
  1061.     B = mtree_agregar_n_hijo(B,F,1);
  1062.     D = mtree_agregar_n_hijo(D,G,0);
  1063.     D = mtree_agregar_n_hijo(D,H,1);
  1064.     D = mtree_agregar_n_hijo(D,I,2);
  1065.     D = mtree_agregar_n_hijo(D,J,3);
  1066.  
  1067.     mtree_recorrer(A, imprimir_entero);
  1068.     printf("\nCantidad: %d\nSuma: %d\n",mtree_cantidad(A), mtree_suma(A));
  1069.    
  1070.     RTree Ar = rtree_crear(1);
  1071.     RTree Br = rtree_crear(2);
  1072.     RTree Cr = rtree_crear(3);
  1073.     RTree Dr = rtree_crear(4);
  1074.     RTree Er = rtree_crear(5);
  1075.     RTree Fr = rtree_crear(6);
  1076.     RTree Gr = rtree_crear(7);
  1077.     RTree Hr = rtree_crear(8);
  1078.     RTree Ir = rtree_crear(9);
  1079.     RTree Jr = rtree_crear(10);
  1080.    
  1081.     rtree_insertar(Br,Er);
  1082.     rtree_insertar(Br,Fr);
  1083.     rtree_insertar(Dr,Gr);
  1084.     rtree_insertar(Dr,Hr);
  1085.     rtree_insertar(Dr,Ir);
  1086.     rtree_insertar(Dr,Jr);
  1087.     rtree_insertar(Ar,Br);
  1088.     rtree_insertar(Ar,Cr);
  1089.     rtree_insertar(Ar,Dr);
  1090.  
  1091.     printf("\n\nImprimimos un Rose Tree (\"\"Preorder\"\"): \n");
  1092.     rtree_imprimir(Ar);
  1093.    
  1094.     MTree convertido = mtreeify(Ar);
  1095.     printf("\n\nUna vez convertido a MulTree(\"\"Postorder\"\"): \n");
  1096.     mtree_recorrer(convertido, imprimir_entero);
  1097.  
  1098.     mtree_destruir(A);
  1099.     return 0;
  1100. }
Add Comment
Please, Sign In to add comment