[C con Clase] Insertar en un árbol binario de búsqueda
User
usuarioanonimomysql en gmail.com
Lun Jun 25 23:33:05 CEST 2012
¡Perfecto Salvador!
Muchas gracias.
Si tengo más dudas sobre esto ya preguntaré de nuevo, de momento tengo
bastantes cosas por probar.
Saludos.
El 21 de junio de 2012 10:06, Salvador Pozo Coronado
<salvador en conclase.net>escribió:
> Hola:
>
> Con fecha miércoles, 20 de junio de 2012, 20:44:13, escribió:
>
> U> Perfecta explicación Salvador.
>
> Me alegro que se haya aclarado algo. :)
>
> U> ¿Podrías poner una implementación de la función fCompara?
>
> Para cada tipo de dato existirá, en principio, una función de
> comparación diferente. Pondré un par de ejemplos.
>
> Imaginemos un tipo de dato con esta definición:
>
> ----8<------
> typedef struct fecha {
> int anno;
> int mes;
> int dia;
> };
> ----8<------
>
> Una función que compare fechas podría ser esta:
>
> ----8<------
> int ComparaFechas(fecha* f1, fecha *f2) {
> if(f1->anno > f2->anno) return 1;
> else if(f1->anno < f2->anno) return -1;
> else if(f1->mes > f2->mes) return 1;
> else if(f1->mes < f2->mes) return -1;
> else if(f1->dia > f2->dia) return 1;
> else if(f1->dia < f2->dia) return -1;
> return 0;
> }
> ----8<------
>
> Verás que los parámetros de la función son punteros a fecha, no
> punteros genéricos. No es necesario que sean genéricos, ya que el
> compilador es capaz de hacer la conversión:
>
> ----8<------
> #include <stdio.h>
>
> typedef struct {
> int anno;
> int mes;
> int dia;
> } fecha;
>
> typedef int (*fCompara)(void*, void*);
>
> int ComparaFechas(fecha* f1, fecha *f2);
>
> int main()
> {
> fCompara funcion;
>
> fecha f1 = {2012,6,26};
> fecha f2 = {2012,7,26};
> printf("%d\n", ComparaFechas(&f1, &f2));
> funcion = (fCompara)ComparaFechas;
> printf("%d\n", funcion(&f1, &f2));
> return 0;
> }
>
> int ComparaFechas(fecha* f1, fecha *f2) {
> if(f1->anno > f2->anno) return 1;
> else if(f1->anno < f2->anno) return -1;
> else if(f1->mes > f2->mes) return 1;
> else if(f1->mes < f2->mes) return -1;
> else if(f1->dia > f2->dia) return 1;
> else if(f1->dia < f2->dia) return -1;
> return 0;
> }
> ----8<------
>
> Para otro tipo de dato, por ejemplo:
>
> ----8<------
> typedef struct {
> float x;
> float y;
> } punto;
> ----8<------
>
> Tenemos que elegir un criterio para decidir cuando un punto es "mayor"
> o "menor" que otro. Podríamos ordenarlos por el valor de 'x', o por el
> valor de 'y'. Para este ejemplo los ordenaremos por su distancia al
> origen, cuanto más lejos estén del (0,0), mayores los consideraremos.
>
> La distancia entre dos puntos (x1,y1), (x2,y2) se calcula como:
> raiz_cuadrada((x1-x2)^2+(y1-y2)^2)
>
> Si el punto 2 es el origen, la función se simplifica:
> raiz_cuadrada(x1^2+y1^2)
>
> Y para nuestros propósitos, podemos optimizar la función de
> comparación, y no calcular la raíz cuadrada, ya que compararemos dos
> distancias, el resultado es el mismo si comparamos el cuadrado de esas
> distancias.
>
> ----8<------
> int ComparaPuntos(punto* p1, punto *p2) {
> float d1, d2;
>
> d1 = p1->x*p1->x + p1->y*p1->y;
> d2 = p2->x*p2->x + p2->y*p2->y;
>
> if(d1 > d2) return 1;
> else if(d1 < d2) return -1;
> return 0;
> }
> ----8<------
>
> Y así en general, para cada tipo de dato, habrá una o varias posibles
> funciones de comparación.
>
> Hasta pronto.
> --
> Saludos,
> Salvador mailto:salvador en conclase.net
> Con Clase: http://www.conclase.net
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120625/85cd870a/attachment.html>
Más información sobre la lista de distribución Cconclase