[C con Clase] Ayuda con estructuras y búsqueda!.

Salvador Pozo salvador en conclase.net
Vie Abr 27 10:56:57 CEST 2007


El pasado 2007-04-27 02:17:18, David Gonzalez escribió:
 
Hola:

DG> Pues eso estaría bien si ya estuvieramos usando objetos y punteros, pero "no 
DG> a todo" por eso pensé en los algoritmos que encontré en c-conclase y los 
DG> intenté implementar pero nada, que cuando se trabaja con estructuras, la 
DG> cosa me cambia y se me hizo un refollon de lo mas extraño

Precisamente, la función qsort está pensada para ordenar arrays, independientemente del tipo de cada elemento. Para aclarar el asunto te mostraré cómo se haría para ordenar tu lista por notas. Verás que no es tan complicado.

Para empezar, necesitamos una función de comparación. Esta función debe ajustarse al prototipo:

int <nombre>(const void *arg1, const void *arg2);

Cada argumento será un puntero genérico que apuntará a un elemento del array, de modo que disponemos de dos elementos que debemos comparar, y devolver un valor en función de cual consideremos mayor. Si consideramos que el mayor es el primero, devolveremos un valor mayor que cero, si el mayor es el segundo, devolveremos un valor menor que cero, y si sin iguales, devolveremos cero.

Para comaparar las notas de dos alumnos podemos usar esta implementación:

int compararnota(const void *arg1, const void *arg2)
{
   // Estas asignaciones nos ayudarán a crear un código más claro:
   struct es *alumno1 = (struct es*)arg1;
   struct es *alumno2 = (struct es*)arg2;
    
   if(alumno1->nota < alumno2->nota) return -1;
   else if(alumno1->nota > alumno2->nota) return 1;
   else return 0;
}

Como verás, hemos convertido los punteros generéricos en punteros a estructuras es, de moso que es más sencillo comparar notas.

El resto es ahora más evidente: comparamos las notas, si la del alumno 1 es menor, retornamos -1, si la menor es la del alumno 2 retornamos 1, en otro caso retornamos 0.

Ahora es muy simple ordenar la lista por notas, basta con invocar a la función qsort:

    qsort(tabla, 3, sizeof(struct es), compararnota);

El primer argumento es la tabla que queremos ordenar. El segundo, el número de elementos que contiene, o los que queremos ordenar (puede que no siempre sea lo mismo). El tercero es el tamaño, en bytes, de cada elemento del array. El último, es el puntero a la función que usaremos para comparar los elementos.

Para crear punteros a funciones no es necesario usar el operador &, basta con usar su identificador.

Esta función es muy potente, y extremadamente rápida para ordenar arrays. Además, creo que, una vez comprendido su funcionamiento, es fácil de usar.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase