Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Corrector: Jasmina Sella Faena
- Grupo: G43
- Entrega: ABB
- Fecha: 22/11
- //abb.c:
- #include <stdlib.h>
- #include "abb.h"
- #include <stddef.h>
- #include <string.h>
- #include "testing.h"
- #include <stdio.h>
- #include <stdbool.h>
- #include <string.h>
- #include "pila.h"
- typedef struct n_abb{
- struct n_abb* izq;
- struct n_abb* der;
- void* dato;
- char* clave;
- }n_abb_t;
- struct abb{
- n_abb_t* raiz;
- abb_comparar_clave_t funcion_comparacion;
- abb_destruir_dato_t funcion_destruccion;
- size_t cant;
- };
- struct abb_iter{
- const abb_t* arbol;
- pila_t* pila_ejecucion;
- };
- typedef struct padre_hijo_n_abb {
- n_abb_t* padre;
- n_abb_t* nodo;
- } padre_hijo_n_abb_t;
- n_abb_t* crear_nodo(void *dato, const char* clave);
- char* strdup(const char* clave);
- bool _abb_in_order(n_abb_t* nodo, bool visitar(const char *, void *, void *), void *extra);
- padre_hijo_n_abb_t* buscar_nodo(const abb_t* abb, const char* clave);
- padre_hijo_n_abb_t* _buscar_nodo(const abb_t* abb, n_abb_t* nodo_actual,n_abb_t* padre, const char* clave, padre_hijo_n_abb_t* padre_hijo);
- abb_t* abb_crear(abb_comparar_clave_t cmp, abb_destruir_dato_t destruir_dato){
- abb_t* abb = malloc(sizeof(abb_t));
- if(!abb) return NULL;
- abb->raiz = NULL;
- abb->funcion_comparacion = cmp;
- abb->funcion_destruccion = destruir_dato;
- abb->cant = 0;
- return abb;
- }
- padre_hijo_n_abb_t* buscar_nodo(const abb_t* abb, const char* clave){
- padre_hijo_n_abb_t* padre_hijo = malloc(sizeof(padre_hijo_n_abb_t));
- if(!padre_hijo) return NULL;
- return _buscar_nodo(abb, abb->raiz, NULL, clave, padre_hijo);
- }
- padre_hijo_n_abb_t* _buscar_nodo(const abb_t* abb, n_abb_t* nodo_actual, n_abb_t*padre, const char* clave, padre_hijo_n_abb_t* padre_hijo){
- if(!nodo_actual){
- padre_hijo->padre = padre;
- padre_hijo->nodo = NULL;
- return padre_hijo;
- }
- int comparacion = abb->funcion_comparacion(clave, nodo_actual->clave);
- if(comparacion > 0) return _buscar_nodo(abb, nodo_actual->der, nodo_actual, clave, padre_hijo);
- if(comparacion < 0) return _buscar_nodo(abb, nodo_actual->izq, nodo_actual, clave, padre_hijo);
- padre_hijo->padre = padre;
- padre_hijo->nodo = nodo_actual;
- return padre_hijo;
- }
- bool abb_guardar(abb_t *arbol, const char *clave, void *dato){
- padre_hijo_n_abb_t* padre_hijo = buscar_nodo(arbol, clave);
- if(!padre_hijo) return false;
- n_abb_t* nodo_actual = padre_hijo->nodo;
- n_abb_t* padre = padre_hijo->padre;
- if(!nodo_actual){
- n_abb_t* nodo_nuevo = crear_nodo(dato, clave);
- if (!nodo_nuevo) return false;
- if(arbol->cant == 0) arbol->raiz = nodo_nuevo;
- else{
- int comparacion_padre = arbol->funcion_comparacion(clave, padre->clave);
- if(comparacion_padre > 0) padre->der = nodo_nuevo;
- else padre->izq = nodo_nuevo;
- }
- arbol->cant++;
- free(padre_hijo);
- return true;
- }
- if (arbol->funcion_destruccion) arbol->funcion_destruccion(nodo_actual->dato);
- nodo_actual->dato = dato;
- free(padre_hijo);
- return true;
- }
- n_abb_t* crear_nodo(void *dato, const char* clave){
- char* clave_copia = strdup(clave);
- if(!clave_copia) return NULL;
- n_abb_t* nodo = malloc(sizeof(n_abb_t));
- if (!nodo) return NULL;
- nodo->dato = dato;
- nodo->clave = clave_copia;
- nodo->izq = NULL;
- nodo->der = NULL;
- return nodo;
- }
- void *abb_borrar(abb_t *arbol, const char *clave){
- padre_hijo_n_abb_t* padre_hijo = buscar_nodo(arbol, clave);
- if(!padre_hijo) return NULL;
- n_abb_t* nodo_actual = padre_hijo->nodo;
- n_abb_t* padre = padre_hijo->padre;
- if (!nodo_actual){
- free(padre_hijo);
- return NULL;
- }
- void* dato = nodo_actual->dato;
- char* clave_actual = nodo_actual->clave;
- bool tiene_dos_hijos = false;
- if(!nodo_actual->der && !nodo_actual->izq){
- if(padre){
- int comparacion_padre = arbol->funcion_comparacion(nodo_actual->clave, padre->clave);
- if(comparacion_padre > 0) padre->der = NULL;
- else padre->izq = NULL;
- }
- free(nodo_actual);
- }
- else if((nodo_actual->der && !nodo_actual->izq) || (!nodo_actual->der && nodo_actual->izq)){
- if(!padre){
- if(nodo_actual->der) arbol->raiz = nodo_actual->der;
- else arbol->raiz = nodo_actual->izq;
- }
- else{
- int comparacion_padre = arbol->funcion_comparacion(nodo_actual->clave, padre->clave);
- if (comparacion_padre > 0){
- if(nodo_actual->der) padre->der = nodo_actual->der;
- else padre->der = nodo_actual->izq;
- }
- else{
- if(nodo_actual->der) padre->izq = nodo_actual->der;
- else padre->izq = nodo_actual->izq;
- }
- }
- free(nodo_actual);
- }
- else if(nodo_actual->der && nodo_actual->izq){
- n_abb_t* reemplazante = nodo_actual->der;
- while(reemplazante->izq) reemplazante = reemplazante->izq;
- char* clave_reemplazo = strdup(reemplazante->clave);
- nodo_actual->dato = abb_borrar(arbol, reemplazante->clave);
- nodo_actual->clave = clave_reemplazo;
- tiene_dos_hijos = true;
- }
- if(!tiene_dos_hijos) arbol->cant--;
- if(arbol->cant == 0) arbol->raiz = NULL;
- free(clave_actual);
- free(padre_hijo);
- return dato;
- }
- void *abb_obtener(const abb_t *arbol, const char *clave){
- padre_hijo_n_abb_t* padre_hijo = buscar_nodo(arbol, clave);
- if (!padre_hijo->nodo){
- free(padre_hijo);
- return NULL;
- }
- void* dato = padre_hijo->nodo->dato;
- free(padre_hijo);
- return dato;
- }
- bool abb_pertenece(const abb_t *arbol, const char *clave){
- padre_hijo_n_abb_t* padre_hijo = buscar_nodo(arbol, clave);
- bool estado = (padre_hijo->nodo) != NULL;
- free(padre_hijo);
- return estado;
- }
- size_t abb_cantidad(abb_t *arbol){
- return arbol->cant;
- }
- void abb_destruir(abb_t* arbol){
- while(arbol->raiz){
- void* dato = abb_borrar(arbol, arbol->raiz->clave);
- if(arbol->funcion_destruccion) arbol->funcion_destruccion(dato);
- }
- free(arbol);
- }
- //Primitivas del iterador.
- //Iterador INTERNO
- void abb_in_order(abb_t *arbol, bool visitar(const char *, void *, void *), void *extra){
- if(!arbol->raiz) return;
- _abb_in_order(arbol->raiz, visitar, extra);
- }
- bool _abb_in_order(n_abb_t* nodo, bool visitar(const char *, void *, void *), void *extra){
- if (nodo->izq){
- if(!_abb_in_order(nodo->izq, visitar, extra)) return false;
- }
- if(!visitar(nodo->clave, nodo->dato, extra)) return false;
- if (nodo->der){
- if(!_abb_in_order(nodo->der, visitar, extra)) return false;
- }
- return true;
- }
- //Iterador EXTERNO
- abb_iter_t* abb_iter_in_crear(const abb_t* arbol){
- abb_iter_t* iter = malloc(sizeof(abb_iter_t));
- if(!iter) return NULL;
- pila_t* pila_ejecucion = pila_crear();
- if(!pila_ejecucion){
- free(iter);
- return NULL;
- }iter->pila_ejecucion = pila_ejecucion;
- iter->arbol = arbol;
- if(arbol->cant != 0){
- pila_apilar(iter->pila_ejecucion, arbol->raiz);
- n_abb_t* tope = arbol->raiz;
- while(tope->izq){
- pila_apilar(iter->pila_ejecucion, tope->izq);
- tope = tope->izq;
- }
- }
- return iter;
- }
- bool abb_iter_in_avanzar(abb_iter_t* iter){
- if(pila_esta_vacia(iter->pila_ejecucion)) return false;
- n_abb_t* desapilado = pila_desapilar(iter->pila_ejecucion);
- if(desapilado->der){
- pila_apilar(iter->pila_ejecucion, desapilado->der);
- n_abb_t* tope = pila_ver_tope(iter->pila_ejecucion);
- while(tope->izq){
- pila_apilar(iter->pila_ejecucion, tope->izq);
- tope = tope->izq;
- }
- }
- return true;
- }
- const char* abb_iter_in_ver_actual(const abb_iter_t* iter){
- if(pila_esta_vacia(iter->pila_ejecucion)) return NULL;
- return ((n_abb_t*)pila_ver_tope(iter->pila_ejecucion))->clave;
- }
- bool abb_iter_in_al_final(const abb_iter_t* iter){
- return pila_esta_vacia(iter->pila_ejecucion);
- }
- void abb_iter_in_destruir(abb_iter_t* iter){
- if(!pila_esta_vacia(iter->pila_ejecucion)) pila_desapilar(iter->pila_ejecucion);
- pila_destruir(iter->pila_ejecucion);
- free(iter);
- }
- //Codigo pruebas:
- #include "abb.h"
- #include "testing.h"
- #include <stddef.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #define VOLUMEN 100
- #define TAM_CADENAS 10
- #include "pila.h"
- /* ******************************************************************
- * PRUEBAS UNITARIAS ALUMNO
- * *****************************************************************/
- void pila_destruir_wrapper(void* pila){
- pila_destruir((pila_t*) pila);
- }
- void prueba_creacion_abb() {
- printf("~~PRUEBA DE CREACIÓN Y DESTRUCCIÓN DEL ABB~~\n");
- abb_t* abb = abb_crear(NULL, NULL);
- print_test("Prueba abb crear vacío", abb != NULL);
- print_test("Prueba abb la cantidad de elementos es 0", abb_cantidad(abb) == 0);
- print_test("Prueba abb obtener clave A es NULL", !abb_obtener(abb, "hola"));
- print_test("Prueba abb obtener clave A es NULL", !abb_borrar(abb, "hola"));
- abb_destruir(abb);
- print_test("abb destruido", true);
- printf("\n");
- }
- void prueba_guardar_elementos() {
- printf("~~PRUEBA DE INSERTAR Y BORRAR ELEMENTOS EN MEMORIA ESTÁTICA~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- int n = 5;
- print_test("Prueba abb guardar un elemento", abb_guardar(abb, "numero", &n));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave A es el valor", abb_obtener(abb, "numero") == &n);
- print_test("Prueba abb pertenece clave A es verdadero", abb_pertenece(abb, "numero"));
- print_test("Prueba abb obtener clave B es NULL", !abb_obtener(abb, "numero2"));
- print_test("Prueba abb pertenece clave B es falso", !abb_pertenece(abb, "numero2"));
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_guardar_elementos_2() {
- printf("~~PRUEBA DE INSERTAR Y BORRAR ELEMENTOS EN MEMORIA ESTÁTICA 2~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- int n = 5;
- int n2 = 3;
- int n3 = 4;
- print_test("Prueba abb guardar clave 1", abb_guardar(abb, "algoritmos", &n));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave 1 es el valor 1", abb_obtener(abb, "algoritmos") == &n);
- print_test("Prueba abb pertenece clave 1 es verdadero", abb_pertenece(abb, "algoritmos"));
- print_test("Prueba abb borrar clave 1 es valor 1", abb_borrar(abb, "algoritmos") == &n);
- print_test("Prueba abb la cantidad de elementos es 0", abb_cantidad(abb) == 0);
- print_test("Prueba abb guardar clave 2", abb_guardar(abb, "programacion", &n2));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave 2 es el valor 2", abb_obtener(abb, "programacion") == &n2);
- print_test("Prueba abb pertenece clave 2 es verdadero", abb_pertenece(abb, "programacion"));
- print_test("Prueba abb guardar clave 3", abb_guardar(abb, "hola", &n3));
- print_test("Prueba abb la cantidad de elementos es 2", abb_cantidad(abb) == 2);
- print_test("Prueba abb obtener clave 3 es el valor 3", abb_obtener(abb, "hola") == &n3);
- print_test("Prueba abb pertenece clave 3 es verdadero", abb_pertenece(abb, "hola"));
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_guardar_elementos_3() {
- printf("~~PRUEBA DE INSERTAR Y BORRAR ELEMENTOS EN MEMORIA ESTÁTICA 3~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- int n = 5;
- int n2 = 3;
- int n3 = 4;
- int n4 = 2;
- int n5 = 21;
- print_test("Prueba abb guardar clave 1", abb_guardar(abb, "algoritmos", &n));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave 1 es el valor 1", abb_obtener(abb, "algoritmos") == &n);
- print_test("Prueba abb pertenece clave 1 es verdadero", abb_pertenece(abb, "algoritmos"));
- print_test("Prueba abb reemplazar clave 1", abb_guardar(abb, "algoritmos", &n4));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave 1 es el valor 1", abb_obtener(abb, "algoritmos") == &n4);
- print_test("Prueba abb guardar clave 2", abb_guardar(abb, "programacion", &n2));
- print_test("Prueba abb la cantidad de elementos es 2", abb_cantidad(abb) == 2);
- print_test("Prueba abb obtener clave 2 es el valor 2", abb_obtener(abb, "programacion") == &n2);
- print_test("Prueba abb pertenece clave 2 es verdadero", abb_pertenece(abb, "programacion"));
- print_test("Prueba abb guardar clave 3", abb_guardar(abb, "hola", &n3));
- print_test("Prueba abb la cantidad de elementos es 3", abb_cantidad(abb) == 3);
- print_test("Prueba abb obtener clave 3 es el valor 3", abb_obtener(abb, "hola") == &n3);
- print_test("Prueba abb pertenece clave 3 es verdadero", abb_pertenece(abb, "hola"));
- print_test("Prueba abb guardar clave 4", abb_guardar(abb, "paralelepipedo", &n5));
- print_test("Prueba abb la cantidad de elementos es 4", abb_cantidad(abb) == 4);
- print_test("Prueba abb pertenece clave 4 es verdadero", abb_pertenece(abb, "paralelepipedo"));
- print_test("Prueba abb obtener clave 4 es el valor 4", abb_obtener(abb, "paralelepipedo") == &n5);
- print_test("Prueba abb obtener clave 1 es el valor 1", abb_obtener(abb, "algoritmos") == &n4);
- print_test("Prueba abb obtener clave 2 es el valor 2", abb_obtener(abb, "programacion") == &n2);
- print_test("Prueba abb obtener clave 3 es el valor 3", abb_obtener(abb, "hola") == &n3);
- abb_destruir(abb);
- printf("\n");
- }
- char* gen_random(){
- static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- char* str = malloc((TAM_CADENAS + 1) * sizeof(char));
- for (int i = 0; i < TAM_CADENAS; i++) str[i] = alphanum[(size_t)rand() % (size_t)(sizeof(alphanum) - 1)];
- str[TAM_CADENAS] = '\0';
- return str;
- }
- void prueba_volumen() {
- printf("~~PRUEBA DE VOLUMEN~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char* arr_cadenas[VOLUMEN];
- bool ok = true;
- for(int i = 0; i < VOLUMEN; i++){
- arr_cadenas[i] = gen_random();
- if (!abb_guardar(abb, arr_cadenas[i], arr_cadenas + i )) ok = false;
- if(!abb_pertenece(abb, arr_cadenas[i])) ok = false;
- if (abb_obtener(abb, arr_cadenas[i]) != arr_cadenas + i) ok = false;
- if (abb_cantidad(abb) != 1 + i) ok = false;
- }
- print_test("Guardo varios elementos, comprobando si todo salio correctamente", ok);
- print_test("El abb no está vacío", abb_cantidad(abb) != 0);
- print_test("La cantidad del abb es el volumen", abb_cantidad(abb) == VOLUMEN);
- for (int i = 0; i < VOLUMEN; i++){
- char** dato = abb_borrar(abb, arr_cadenas[i]);
- if (dato != arr_cadenas + i) ok = false;
- if (abb_cantidad(abb) != VOLUMEN - 1 - i) ok = false;
- if (abb_obtener(abb, arr_cadenas[i])) ok = false;
- if (abb_pertenece(abb, arr_cadenas[i])) ok = false;
- free(arr_cadenas[i]);
- }
- print_test("Borro varios elementos, comprobando si todo salio correctamente", ok);
- print_test("El abb está vacío", abb_cantidad(abb) == 0);
- abb_destruir(abb);
- print_test("El abb fue destruído", true);
- printf("\n");
- }
- void prueba_abb_clave_vacia(){
- printf("~~PRUEBA DE INSERTAR CLAVE VACÍA~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char *clave = "", *valor = "";
- print_test("Prueba abb guardar clave vacia", abb_guardar(abb, clave, valor));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave vacia es valor", abb_obtener(abb, clave) == valor);
- print_test("Prueba abb pertenece clave vacia, es true", abb_pertenece(abb, clave));
- print_test("Prueba abb borrar clave vacia, es valor", abb_borrar(abb, clave) == valor);
- print_test("Prueba abb la cantidad de elementos es 0", abb_cantidad(abb) == 0);
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_abb_reemplazar_con_destruir(){
- printf("~~PRUEBA DE INSERTAR Y BORRAR ELEMENTOS EN MEMORIA DINÁMICA~~\n");
- abb_t* abb = abb_crear(strcmp, free);
- char *clave1 = "perro", *valor1a, *valor1b;
- char *clave2 = "gato", *valor2a, *valor2b;
- valor1a = malloc(10 * sizeof(char));
- valor1b = malloc(10 * sizeof(char));
- valor2a = malloc(10 * sizeof(char));
- valor2b = malloc(10 * sizeof(char));
- print_test("Prueba abb insertar clave1", abb_guardar(abb, clave1, valor1a));
- print_test("Prueba abb obtener clave1 es valor1a", abb_obtener(abb, clave1) == valor1a);
- print_test("Prueba abb obtener clave1 es valor1a", abb_obtener(abb, clave1) == valor1a);
- print_test("Prueba abb insertar clave2", abb_guardar(abb, clave2, valor2a));
- print_test("Prueba abb obtener clave2 es valor2a", abb_obtener(abb, clave2) == valor2a);
- print_test("Prueba abb obtener clave2 es valor2a", abb_obtener(abb, clave2) == valor2a);
- print_test("Prueba abb la cantidad de elementos es 2", abb_cantidad(abb) == 2);
- print_test("Prueba abb insertar clave1 con otro valor", abb_guardar(abb, clave1, valor1b));
- print_test("Prueba abb obtener clave1 es valor1b", abb_obtener(abb, clave1) == valor1b);
- print_test("Prueba abb obtener clave1 es valor1b", abb_obtener(abb, clave1) == valor1b);
- print_test("Prueba abb insertar clave2 con otro valor", abb_guardar(abb, clave2, valor2b));
- print_test("Prueba abb obtener clave2 es valor2b", abb_obtener(abb, clave2) == valor2b);
- print_test("Prueba abb obtener clave2 es valor2b", abb_obtener(abb, clave2) == valor2b);
- print_test("Prueba abb la cantidad de elementos es 2", abb_cantidad(abb) == 2);
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_abb_borrar(){
- printf("~~PRUEBA DE BORRAR ELEMENTOS~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char *clave1 = "perro", *valor1 = "guau";
- char *clave2 = "gato", *valor2 = "miau";
- char *clave3 = "vaca", *valor3 = "mu";
- print_test("Prueba abb insertar clave1", abb_guardar(abb, clave1, valor1));
- print_test("Prueba abb insertar clave2", abb_guardar(abb, clave2, valor2));
- print_test("Prueba abb insertar clave3", abb_guardar(abb, clave3, valor3));
- print_test("Prueba abb pertenece clave3, es verdadero", abb_pertenece(abb, clave3));
- print_test("Prueba abb borrar clave3, es valor3", abb_borrar(abb, clave3) == valor3);
- print_test("Prueba abb borrar clave3, es NULL", !abb_borrar(abb, clave3));
- print_test("Prueba abb pertenece clave3, es falso", !abb_pertenece(abb, clave3));
- print_test("Prueba abb obtener clave3, es NULL", !abb_obtener(abb, clave3));
- print_test("Prueba abb la cantidad de elementos es 2", abb_cantidad(abb) == 2);
- print_test("Prueba abb pertenece clave1, es verdadero", abb_pertenece(abb, clave1));
- print_test("Prueba abb borrar clave1, es valor1", abb_borrar(abb, clave1) == valor1);
- print_test("Prueba abb borrar clave1, es NULL", !abb_borrar(abb, clave1));
- print_test("Prueba abb pertenece clave1, es falso", !abb_pertenece(abb, clave1));
- print_test("Prueba abb obtener clave1, es NULL", !abb_obtener(abb, clave1));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb pertenece clave2, es verdadero", abb_pertenece(abb, clave2));
- print_test("Prueba abb borrar clave2, es valor2", abb_borrar(abb, clave2) == valor2);
- print_test("Prueba abb borrar clave2, es NULL", !abb_borrar(abb, clave2));
- print_test("Prueba abb pertenece clave2, es falso", !abb_pertenece(abb, clave2));
- print_test("Prueba abb obtener clave2, es NULL", !abb_obtener(abb, clave2));
- print_test("Prueba abb la cantidad de elementos es 0", abb_cantidad(abb) == 0);
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_insertar_null() {
- printf("~~PRUEBA DE GUARDAR VALOR NULL~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char *clave = "", *valor = NULL;
- print_test("Prueba abb insertar clave vacia valor NULL", abb_guardar(abb, clave, valor));
- print_test("Prueba abb la cantidad de elementos es 1", abb_cantidad(abb) == 1);
- print_test("Prueba abb obtener clave vacia es valor NULL", abb_obtener(abb, clave) == valor);
- print_test("Prueba abb pertenece clave vacia, es true", abb_pertenece(abb, clave));
- print_test("Prueba abb borrar clave vacia, es valor NULL", abb_borrar(abb, clave) == valor);
- print_test("Prueba abb la cantidad de elementos es 0", abb_cantidad(abb) == 0);
- abb_destruir(abb);
- printf("\n");
- }
- static ssize_t buscar(const char* clave, char* claves[], size_t largo)
- {
- for (size_t i = 0; i < largo; i++) {
- if (strcmp(clave, claves[i]) == 0) return (ssize_t) i;
- }
- return -1;
- }
- void prueba_iterador_abb_vacio() {
- printf("~~PRUEBA DE CREAR ITERADOR EN ABB VACÍO~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- print_test("La cantidad de elementos es 0", abb_cantidad(abb) == 0);
- print_test("Obtener la clave A es NULL, no existe", !abb_obtener(abb, "A"));
- print_test("Pertenece clave A es NULL, no existe", !abb_pertenece(abb, "A"));
- print_test("Borrar clave A es NULL, no existe", !abb_borrar(abb, "A"));
- abb_iter_t* iter = abb_iter_in_crear(abb);
- print_test("El iterador está al final", abb_iter_in_al_final(iter));
- print_test("Avanzar devuelve false", !abb_iter_in_avanzar(iter));
- print_test("Ver actual devuelve NULL", !abb_iter_in_ver_actual(iter));
- char* clave1 = "marciano";
- char* clave2 = "androide";
- char* clave3 = "pentagono";
- int valor1 = 1;
- int valor2 = 3;
- int valor3 = 7;
- print_test("Guardo la clave1", abb_guardar(abb, clave1, &valor1));
- print_test("Guardo la clave2", abb_guardar(abb, clave2, &valor2));
- print_test("Guardo la clave3", abb_guardar(abb, clave3, &valor3));
- print_test("El iterador esta al final" , abb_iter_in_al_final(iter));
- abb_iter_in_destruir(iter);
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_recorrer(){
- printf("~~PRUEBA RECORRER~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char* clave1 = "programa";
- char* clave2 = "medio";
- char* clave3 = "yugoslavo";
- char* clave4 = "arte";
- char* clave5 = "oro";
- char* clave6 = "super";
- char* clave7 = "zorro";
- int valor1 = 3;
- int valor2 = 32;
- int valor3 = 322;
- int valor4 = 455;
- int valor5 = 544;
- int valor6 = 777;
- int valor7 = 999;
- print_test("Guardo la clave 1", abb_guardar(abb, clave1, &valor1));
- print_test("Guardo la clave 2", abb_guardar(abb, clave2, &valor2));
- print_test("Guardo la clave 3", abb_guardar(abb, clave3, &valor3));
- print_test("Guardo la clave 4", abb_guardar(abb, clave4, &valor4));
- print_test("Guardo la clave 5", abb_guardar(abb, clave5, &valor5));
- print_test("Guardo la clave 6", abb_guardar(abb, clave6, &valor6));
- print_test("Guardo la clave 7", abb_guardar(abb, clave7, &valor7));
- abb_iter_t* iter = abb_iter_in_crear(abb);
- print_test("El iterador no esta al final", !abb_iter_in_al_final(iter));
- print_test("Ver actual es clave4", strcmp(abb_iter_in_ver_actual(iter), clave4) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave2", strcmp(abb_iter_in_ver_actual(iter), clave2) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave3", strcmp(abb_iter_in_ver_actual(iter), clave5) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave3", strcmp(abb_iter_in_ver_actual(iter), clave1) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave3", strcmp(abb_iter_in_ver_actual(iter), clave6) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave3", strcmp(abb_iter_in_ver_actual(iter), clave3) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Ver actual es clave3", strcmp(abb_iter_in_ver_actual(iter), clave7) == 0);
- print_test("Avanzar es true", abb_iter_in_avanzar(iter));
- print_test("El iterador esta al final", abb_iter_in_al_final(iter));
- print_test("Avanzar es false", !abb_iter_in_avanzar(iter));
- printf("\n");
- abb_iter_in_destruir(iter);
- abb_destruir(abb);
- }
- void prueba_abb_iterar(){
- printf("~~PRUEBA DE ITERADOR ABB~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- char *claves[] = {"perro", "gato", "vaca"};
- char *valores[] = {"guau", "miau", "mu"};
- print_test("Prueba abb insertar clave1", abb_guardar(abb, claves[0], valores[0]));
- print_test("Prueba abb insertar clave2", abb_guardar(abb, claves[1], valores[1]));
- print_test("Prueba abb insertar clave3", abb_guardar(abb, claves[2], valores[2]));
- abb_iter_t* iter = abb_iter_in_crear(abb);
- const char *clave;
- ssize_t indice;
- print_test("Prueba abb iterador esta al final, es false", !abb_iter_in_al_final(iter));
- clave = abb_iter_in_ver_actual(iter);
- indice = buscar(clave, claves, sizeof(claves) / sizeof(char *));
- print_test("Prueba abb iterador ver actual, es una clave valida", indice != -1);
- print_test("Prueba abb iterador ver actual, no es el mismo puntero", clave != claves[indice]);
- print_test("Prueba abb iterador avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Prueba abb iterador esta al final, es false", !abb_iter_in_al_final(iter));
- clave = abb_iter_in_ver_actual(iter);
- indice = buscar(clave, claves, sizeof(claves) / sizeof(char *));
- print_test("Prueba abb iterador ver actual, es una clave valida", indice != -1);
- print_test("Prueba abb iterador ver actual, no es el mismo puntero", clave != claves[indice]);
- print_test("Prueba abb iterador avanzar es true", abb_iter_in_avanzar(iter));
- print_test("Prueba abb iterador esta al final, es false", !abb_iter_in_al_final(iter));
- clave = abb_iter_in_ver_actual(iter);
- indice = buscar(clave, claves, sizeof(claves) / sizeof(char *));
- print_test("Prueba abb iterador ver actual, es una clave valida", indice != -1);
- print_test("Prueba abb iterador ver actual, no es el mismo puntero", clave != claves[indice]);
- abb_iter_in_avanzar(iter);
- print_test("Prueba abb iterador esta al final, es true", abb_iter_in_al_final(iter));
- print_test("Prueba abb iterador ver actual, es NULL", !abb_iter_in_ver_actual(iter));
- print_test("Prueba abb iterador avanzar es false", !abb_iter_in_avanzar(iter));
- print_test("Prueba abb iterador esta al final, es true", abb_iter_in_al_final(iter));
- abb_iter_in_destruir(iter);
- abb_destruir(abb);
- printf("\n");
- }
- void prueba_abb_iterar_volumen(){
- printf("~~PRUEBA DE VOLUMEN ITERADOR ABB~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- const size_t largo_clave = 10;
- char (*claves)[largo_clave] = malloc(VOLUMEN * largo_clave);
- size_t valores[VOLUMEN];
- bool ok = true;
- for (unsigned i = 0; i < VOLUMEN; i++) {
- sprintf(claves[i], "%08d", i);
- valores[i] = i;
- ok = abb_guardar(abb, claves[i], &valores[i]);
- if (!ok) break;
- }
- abb_iter_t* iter = abb_iter_in_crear(abb);
- print_test("Prueba abb iterador esta al final, es false", !abb_iter_in_al_final(iter));
- ok = true;
- unsigned i;
- const char *clave;
- size_t *valor;
- for (i = 0; i < VOLUMEN; i++) {
- if ( abb_iter_in_al_final(iter) ) {
- ok = false;
- break;
- }
- clave = abb_iter_in_ver_actual(iter);
- if ( clave == NULL ) {
- ok = false;
- break;
- }
- valor = abb_obtener(abb, clave);
- if ( valor == NULL ) {
- ok = false;
- break;
- }
- *valor = VOLUMEN;
- abb_iter_in_avanzar(iter);
- }
- print_test("Prueba abb iteración en volumen", ok);
- print_test("Prueba abb iteración en volumen, recorrio todo el largo", i == VOLUMEN);
- print_test("Prueba abb iterador esta al final, es true", abb_iter_in_al_final(iter));
- ok = true;
- for (i = 0; i < VOLUMEN; i++) {
- if ( valores[i] != VOLUMEN ) {
- ok = false;
- break;
- }
- }
- print_test("Prueba abb iteración en volumen, se cambiaron todo los elementos", ok);
- free(claves);
- abb_iter_in_destruir(iter);
- abb_destruir(abb);
- printf("\n");
- }
- bool multiplicar_por_2(const char* clave, void* dato, void* extra){
- *(int*) dato = *(int*) dato * 2;
- return true;
- }
- void prueba_iterador_interno(){
- printf("~~PRUEBA DE ITERADOR INTERNO SIN CORTE Y SIN EXTRA~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- int a = 1;
- int b = 2;
- int c = 3;
- print_test("Guardo la clave A", abb_guardar(abb, "arbol", &a));
- print_test("Guardo la clave B", abb_guardar(abb, "anda", &b));
- print_test("Guardo la clave B", abb_guardar(abb, "bien", &c));
- abb_in_order(abb, multiplicar_por_2, NULL);
- bool ok = true;
- if (a != 2 || b !=4 || c != 6) ok = false;
- print_test("Aplico mi función visitar, que multiplica por 2 todos los elementos del abb", ok);
- abb_destruir(abb);
- printf("\n");
- }
- bool multiplicar_primeros(const char* clave, void* dato, void* extra){
- if (*(size_t*) extra >= 5){
- return false;
- }
- *(int*) dato = *(int*) dato * 2;
- *(size_t*) extra += 1;
- return true;
- }
- void prueba_iterador_interno2(){
- printf("~~PRUEBA DE ITERADOR INTERNO CON CORTE Y EXTRA~~\n");
- abb_t* abb = abb_crear(strcmp, NULL);
- int a = 21;
- int b = 6;
- int c = 12;
- int d = 8;
- int e = 5;
- int f = 22;
- int g = 97;
- print_test("Guardo la clave A", abb_guardar(abb, "arbol", &a));
- print_test("Guardo la clave A", abb_guardar(abb, "anda", &b));
- print_test("Guardo la clave A", abb_guardar(abb, "bien", &c));
- print_test("Guardo la clave A", abb_guardar(abb, "sin", &d));
- print_test("Guardo la clave A", abb_guardar(abb, "errores", &e));
- print_test("Guardo la clave A", abb_guardar(abb, "ni", &f));
- print_test("Guardo la clave A", abb_guardar(abb, "problemas", &g));
- size_t contador = 0;
- abb_in_order(abb, multiplicar_primeros, &contador);
- bool ok = true;
- if (a != 42 || b != 12 || c != 24 || d != 8 || e != 10 || f != 44 || g != 97){
- ok = false;
- }
- print_test("Aplico mi función visitar, que multiplica por 2 los primeros 5 elementos del abb", ok);
- abb_destruir(abb);
- printf("\n");
- }
- void pruebas_abb_alumno() {
- printf("\n");
- prueba_creacion_abb();
- prueba_guardar_elementos();
- prueba_guardar_elementos_2();
- prueba_guardar_elementos_3();
- prueba_volumen();
- prueba_abb_clave_vacia();
- prueba_abb_reemplazar_con_destruir();
- prueba_abb_borrar();
- prueba_insertar_null();
- prueba_iterador_abb_vacio();
- prueba_recorrer();
- prueba_abb_iterar();
- prueba_abb_iterar_volumen();
- prueba_iterador_interno();
- prueba_iterador_interno2();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement