/
abb_minipruebas.c
162 lines (127 loc) · 4.86 KB
/
abb_minipruebas.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "abb.h"
#include <stdio.h>
typedef struct cosa{
int clave;
char contenido[10];
}cosa;
cosa* crear_cosa(int clave){
cosa* c = (cosa*)malloc(sizeof(cosa));
if(c)
c->clave = clave;
return c;
}
void destruir_cosa(cosa* c){
free(c);
}
int comparar_cosas(void* elemento1, void* elemento2){
if(!elemento1 || !elemento2)
return 0;
if(((cosa*)elemento1)->clave>((cosa*)elemento2)->clave)
return 1;
if(((cosa*)elemento1)->clave<((cosa*)elemento2)->clave)
return -1;
return 0;
}
void destructor_de_cosas(void* elemento){
if(!elemento)
return;
destruir_cosa((cosa*)elemento);
}
bool mostrar_elemento(void* elemento, void* extra){
extra=extra; //para que no se queje el compilador, gracias -Werror -Wall
if(elemento)
printf("%i ", ((cosa*)elemento)->clave);
return false;
}
bool mostrar_hasta_5(void* elemento, void* extra){
extra=extra; //para que no se queje el compilador, gracias -Werror -Wall
if(elemento){
printf("%i ", ((cosa*)elemento)->clave);
if(((cosa*)elemento)->clave == 5)
return true;
}
return false;
}
bool mostrar_acumulado(void* elemento, void* extra){
if(elemento && extra){
*(int*)extra += ((cosa*)elemento)->clave;
printf("%i ", *(int*)extra);
}
return false;
}
void pruebas_catedra(){
abb_t* arbol = arbol_crear(comparar_cosas, destructor_de_cosas);
cosa* c1= crear_cosa(1);
cosa* c2= crear_cosa(2);
cosa* c3= crear_cosa(3);
cosa* c4= crear_cosa(4);
cosa* c5= crear_cosa(5);
cosa* c6= crear_cosa(6);
cosa* c7= crear_cosa(7);
cosa* auxiliar = crear_cosa(0);
arbol_insertar(arbol, c4);
arbol_insertar(arbol, c2);
arbol_insertar(arbol, c6);
arbol_insertar(arbol, c1);
arbol_insertar(arbol, c3);
arbol_insertar(arbol, c5);
arbol_insertar(arbol, c7);
printf("El nodo raiz deberia ser 4: %s\n", ((cosa*)arbol_raiz(arbol))->clave==4?"SI":"NO");
auxiliar->clave = 5;
printf("Busco el elemento 5: %s\n", ((cosa*)arbol_buscar(arbol, auxiliar))->clave==5?"SI":"NO");
auxiliar->clave = 7;
printf("Borro nodo hoja (7): %s\n", (arbol_borrar(arbol, auxiliar))==0?"SI":"NO");
auxiliar->clave = 6;
printf("Borro nodo con un hijo (6): %s\n", (arbol_borrar(arbol, auxiliar))==0?"SI":"NO");
auxiliar->clave = 2;
printf("Borro nodo con dos hijos (2): %s\n", (arbol_borrar(arbol, auxiliar))==0?"SI":"NO");
auxiliar->clave = 4;
printf("Borro la raiz (4): %s\n", (arbol_borrar(arbol, auxiliar))==0?"SI":"NO");
auxiliar->clave = 3;
printf("Busco el elemento (3): %s\n", ((cosa*)arbol_buscar(arbol, auxiliar))->clave==3?"SI":"NO");
printf("Busco el elemento (3): %s\n", ((cosa*)arbol_raiz(arbol))->clave==3?"SI":"NO");
cosa* elementos[10];
printf("Recorrido inorden (deberian salir en orden 1 3 5): ");
size_t cantidad = arbol_recorrido_inorden(arbol, (void**)elementos, 10);
for(size_t i=0;i<cantidad;i++)
printf("%i ", elementos[i]->clave);
printf("\n");
printf("\n\nInserto mas valores y pruebo el iterador interno\n\n");
arbol_insertar(arbol, crear_cosa(15));
arbol_insertar(arbol, crear_cosa(0));
arbol_insertar(arbol, crear_cosa(9));
arbol_insertar(arbol, crear_cosa(7));
arbol_insertar(arbol, crear_cosa(4));
printf("Recorrido inorden iterador interno: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_INORDEN, mostrar_elemento, NULL);
printf("\n");
printf("Recorrido preorden iterador interno: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_PREORDEN, mostrar_elemento, NULL);
printf("\n");
printf("Recorrido postorden iterador interno: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_POSTORDEN, mostrar_elemento, NULL);
printf("\n");
printf("\nRecorrido inorden hasta encontrar el 5: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_INORDEN, mostrar_hasta_5, NULL);
printf("\n");
printf("Recorrido preorden hasta encontrar el 5: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_PREORDEN, mostrar_hasta_5, NULL);
printf("\n");
printf("Recorrido postorden hasta encontrar el 5: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_POSTORDEN, mostrar_hasta_5, NULL);
printf("\n");
int acumulador=0;
printf("\nRecorrido inorden acumulando los valores: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_INORDEN, mostrar_acumulado, &acumulador);
printf("\n");
acumulador=0;
printf("Recorrido preorden acumulando los valores: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_PREORDEN, mostrar_acumulado, &acumulador);
printf("\n");
acumulador=0;
printf("Recorrido postorden acumulando los valores: ");
abb_con_cada_elemento(arbol, ABB_RECORRER_POSTORDEN, mostrar_acumulado, &acumulador);
printf("\n");
free(auxiliar);
arbol_destruir(arbol);
}