Advertisement
franbricchi

Untitled

Oct 9th, 2019
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.06 KB | None | 0 0
  1. #include "pila.h"
  2. #include <stdlib.h>
  3. #define TAM  10
  4.  
  5. /* Definición del struct pila proporcionado por la cátedra.
  6.  */
  7. struct pila {
  8.     void** datos;
  9.     size_t cantidad;  // Cantidad de elementos almacenados.
  10.     size_t capacidad;  // Capacidad del arreglo 'datos'.
  11. };
  12.  
  13. /* *****************************************************************
  14.  *                    PRIMITIVAS DE LA PILA
  15.  * *****************************************************************/
  16.  
  17. // Crea una pila.
  18. // Post: devuelve una nueva pila vacía.
  19. pila_t* pila_crear(void){
  20.     pila_t* pila = malloc(sizeof(pila_t));
  21.     if (!pila) {
  22.         return NULL;
  23.     }
  24.     pila->datos = malloc(TAM * sizeof(void*));
  25.     if (! pila->datos) {
  26.         free(pila);
  27.         return NULL;
  28.     }
  29.     pila->capacidad = TAM;
  30.     pila->cantidad = 0;
  31.     return pila;
  32. }
  33.  
  34. // Destruye la pila.
  35. // Pre: la pila fue creada.
  36. // Post: se eliminaron todos los elementos de la pila.
  37. void pila_destruir(pila_t *pila){
  38.     if (pila){
  39.         free(pila->datos);
  40.         free(pila);
  41.     }
  42. }
  43.  
  44. // Devuelve verdadero si la pila no tiene elementos apilados, false en caso contrario.
  45. // Pre: la pila fue creada.
  46. bool pila_esta_vacia(const pila_t *pila){
  47.     if(pila->cantidad == 0){
  48.         return true;
  49.     }
  50.     return false;
  51. }
  52.  
  53. //Redimensiona la pila, agrandandola o achicandola segun sea necesario, devuelve
  54. //false en caso de que el realloc devuelva NULL, y true si la redimension fue
  55. //exitosa y se sobreescribieron los datos.
  56. //Pre: la pila fue creada y necesita ser redimensionada
  57. //Post: la pila fue redimensionada, en caso de haber sido necesario
  58. bool redimensionar(pila_t* pila){
  59.     if(pila->cantidad == pila->capacidad){
  60.         pila->capacidad = pila->capacidad * 2;
  61.         void** d = realloc(pila->datos, pila->capacidad * sizeof(void*));
  62.         if(!d){
  63.             return false;      
  64.         }
  65.         pila->datos = d;
  66.         return true;
  67.     }
  68.  
  69.     else if(pila->cantidad * 4 <= pila->capacidad){
  70.         pila->capacidad = pila->capacidad / 2;
  71.         void** d = realloc(pila->datos,pila->capacidad * sizeof(void*));
  72.         if(!d){
  73.             return false;
  74.         }
  75.  
  76.         pila->datos = d;
  77.         return true;
  78.     }
  79.     return false;
  80. }
  81.  
  82. // Agrega un nuevo elemento a la pila. Devuelve falso en caso de error.
  83. // Pre: la pila fue creada.
  84. // Post: se agregó un nuevo elemento a la pila, valor es el nuevo tope.
  85. bool pila_apilar(pila_t *pila, void* valor){
  86.     if(!pila){
  87.         return false;
  88.     }
  89.  
  90.     if(pila->cantidad == pila->capacidad){
  91.         if(!redimensionar(pila)){
  92.             return false;
  93.         }  
  94.     }
  95.  
  96.     pila->datos[pila->cantidad] = valor;
  97.     pila->cantidad ++;
  98.     return true;
  99. }
  100.  
  101. // Obtiene el valor del tope de la pila. Si la pila tiene elementos,
  102. // se devuelve el valor del tope. Si está vacía devuelve NULL.
  103. // Pre: la pila fue creada.
  104. // Post: se devolvió el valor del tope de la pila, cuando la pila no está
  105. // vacía, NULL en caso contrario.
  106. void* pila_ver_tope(const pila_t *pila){
  107.     if(pila_esta_vacia(pila)){
  108.         return NULL;
  109.     }
  110.     return pila->datos[pila->cantidad-1];
  111. }
  112.  
  113. // Saca el elemento tope de la pila. Si la pila tiene elementos, se quita el
  114. // tope de la pila, y se devuelve ese valor. Si la pila está vacía, devuelve
  115. // NULL.
  116. // Pre: la pila fue creada.
  117. // Post: si la pila no estaba vacía, se devuelve el valor del tope anterior
  118. // y la pila contiene un elemento menos.
  119. void* pila_desapilar(pila_t *pila){
  120.     if(pila_esta_vacia(pila)){
  121.         return NULL;
  122.     }
  123.     void* tope = pila->datos[pila->cantidad - 1];
  124.     pila->cantidad --;
  125.     if(pila->cantidad * 4 <= pila->capacidad && pila->capacidad >= TAM){
  126.         if(!redimensionar(pila)){
  127.             return false;
  128.         }
  129.     }
  130.     return tope;
  131. }
  132.  
  133. #include "pila.h"
  134. #include "testing.h"
  135. #include <stddef.h>
  136. #include <stdio.h>
  137. #include <stdlib.h>
  138.  
  139.  
  140. /* ******************************************************************
  141.  *                   PRUEBAS UNITARIAS ALUMNO
  142.  * *****************************************************************/
  143.  
  144. void pruebas_pila_vacia(){
  145.     //Verifico resultados en una pila vacia
  146.     pila_t* pila_vacia = pila_crear();
  147.     printf("INICIO DE PRUEBAS PILA VACIA\n");
  148.     print_test("NULL es tope de una pila vacia", pila_ver_tope(pila_vacia) == NULL);
  149.     print_test("Probar si pila esta vacia", pila_esta_vacia(pila_vacia) == true);
  150.     print_test("No se puede desapilar pila vacia", pila_desapilar(pila_vacia) == NULL);
  151.     //Destruyo pila vacia
  152.     pila_destruir(pila_vacia);
  153.     print_test("Destruir pila vacia", true);
  154. }
  155.  
  156. void pruebas_con_un_elemento(){
  157.    
  158.     //Verifico resultados en una pila con un elemento
  159.    
  160.     pila_t* pila_unitaria = pila_crear();
  161.     int* a = malloc(sizeof(int*));
  162.     *a = 20;
  163.     printf("INICIO DE PRUEBAS PILA CON UN ELEMENTO\n");
  164.     pila_apilar(pila_unitaria,a);
  165.     free(a);
  166.     print_test("Se pudo apilar un elemento y tiene como tope el elemento recien apilado", pila_ver_tope(pila_unitaria) == a);
  167.     print_test("La pila ya no esta vacia", pila_esta_vacia(pila_unitaria) == false);
  168.     pila_desapilar(pila_unitaria);
  169.     print_test("Se desapilo el elemento(NULL es tope de pila)", pila_ver_tope(pila_unitaria) == NULL);
  170.     print_test("La pila vuelve a estar vacia", pila_esta_vacia(pila_unitaria) == true);
  171.    
  172.     //Destruyo pila unitaria
  173.    
  174.     pila_destruir(pila_unitaria);
  175.     print_test("Destruir pila unitaria", true);
  176. }
  177.  
  178. void pruebas_apilando_NULL(){
  179.     printf("PRUEBA DE EJEMPLO CATEDRA\n");
  180.     pila_t* ejemplo = NULL;
  181.     print_test("Puntero inicializado a NULL", ejemplo == NULL);
  182.     pila_t* pila_elem_nulo = pila_crear();    
  183.    
  184.     //Se puede apilar NULL
  185.    
  186.     printf("PRUEBA APILANDO NULL\n");
  187.     for(int i = 0; i != 5;i++){
  188.         void* elemento_nulo = malloc(sizeof(void*));
  189.         free(elemento_nulo);
  190.         elemento_nulo = NULL;
  191.         pila_apilar(pila_elem_nulo,elemento_nulo);
  192.     }
  193.     print_test("Prueba apilar varias veces NULL(verifico si la pila esta vacia)", pila_esta_vacia(pila_elem_nulo) == false);
  194.     print_test("Prueba apilar varias veces NULL (verifico que el tope sea NULL)", pila_ver_tope(pila_elem_nulo) == NULL);  
  195.     pila_desapilar(pila_elem_nulo);
  196.     print_test("Se desapilo un NULL, pero sigue habiendo otros(la pila no esta vacia)", pila_esta_vacia(pila_elem_nulo) == false);
  197.    
  198.     //Destruyo pila con NULL
  199.    
  200.     pila_destruir(pila_elem_nulo);
  201.     print_test("Destruir pila con NULL", true);
  202. }
  203.  
  204. void pruebas_volumen(){
  205.     //Apilo muchos elementos y verifico tope
  206.  
  207.     int* x = (int*) 20 ;
  208.     void* l = "prueba";
  209.  
  210.     pila_t* pila_probar = pila_crear();
  211.  
  212.     for(int i = 0; i != 100000 ;i++){
  213.         int* elem_1 = malloc(sizeof(int*));
  214.         free(elem_1);
  215.         elem_1 = x;
  216.         pila_apilar(pila_probar,elem_1);
  217.         char* elem_2 = malloc(sizeof(char*));
  218.         free(elem_2);
  219.         elem_2 = l;
  220.         pila_apilar(pila_probar,elem_2);
  221.     }
  222.  
  223.     print_test("Prueba apilar algunos elementos", pila_esta_vacia(pila_probar) == false);
  224.     print_test("Verificar que el tope sea el correcto", pila_ver_tope(pila_probar) == l);
  225.  
  226.     pila_desapilar(pila_probar);
  227.     print_test("Desapilo y vuelvo a verificar tope", pila_ver_tope(pila_probar) == x);
  228.  
  229.     //Puedo vaciar pila con elementos
  230.    
  231.     while(!pila_esta_vacia(pila_probar)){
  232.         pila_desapilar(pila_probar);
  233.     }
  234.     print_test("Pila con elementos se pudo vaciar", pila_esta_vacia(pila_probar) == true);
  235.     print_test("Desapilar pila vacia devuelve NULL" , pila_desapilar(pila_probar) == NULL);
  236.  
  237.     //Vuelvo a apilar muchos elementos para probar destruir pila no vacia
  238.  
  239.     for(int i = 0; i != 500 ;i++){
  240.         void* elem_1 = malloc(sizeof(void*));
  241.         free(elem_1);
  242.         elem_1 = x;
  243.         pila_apilar(pila_probar,elem_1);
  244.         void* elem_2 = malloc(sizeof(void*));
  245.         free(elem_2);
  246.         elem_2 = l;
  247.         pila_apilar(pila_probar,elem_2);
  248.     }
  249.  
  250.     //Destruyo pila no vacia
  251.    
  252.     pila_destruir(pila_probar);
  253.     print_test("Destruir pila no vacia", true);
  254. }
  255.  
  256.  
  257. /* ******************************************************************
  258.  *                        PROGRAMA PRINCIPAL
  259.  * *****************************************************************/
  260.  
  261. /* Programa principal. */
  262.  
  263. void pruebas_pila_alumno(void) {
  264.    
  265.     /* Ejecutar todas las pruebas unitarias. */
  266.    
  267.     pruebas_pila_vacia();
  268.     pruebas_con_un_elemento();
  269.     pruebas_apilando_NULL();
  270.     pruebas_volumen();
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement