#include #include /* * Alle Funktionen muessen die Pointer * immer erst in den richtigen Datentyp casten! * */ void swap_int(void *p1, void *p2) { int tmp; tmp = *((int *)p1); *((int *)p1) = *((int *)p2); *((int *)p2) = tmp; } int compare_int(const void *p1, const void *p2) { int i = *((int *)p1); int j = *((int *)p2); if (i > j) { return (1); } if (i < j) { return (-1); } return (0); } void swap_double(void *p1, void *p2) { double tmp; tmp = *((double *)p1); *((double *)p1) = *((double *)p2); *((double *)p2) = tmp; } int compare_double(const void *p1, const void *p2) { int i = *((double *)p1); int j = *((double *)p2); if (i > j) { return (1); } if (i < j) { return (-1); } return (0); } /* * Die Angabe von elems_size ist wichtig, * weil ansonsten bei void die Groesse nicht definiert ist! */ void sort( void *vector, long int num_elems, short int elems_size, int (*compare)(const void *, const void *), void (*swap)(void *, void *) ) { unsigned long i, j; for(i=0; i < num_elems; i++) { for(j=0; j < num_elems; j++) { /* * Vergleich der Elemente i und j * Es soll aufsteigen sortiert werden => -1 * Anschließend vertauschen. */ if( compare((vector + i*elems_size), (vector + j*elems_size)) == -1) { swap( (vector + i*elems_size), (vector + j*elems_size) ); } } } } /* * Kompilieren mit: gcc -Wall sort.c -o sort */ int main () { unsigned long i; unsigned long a_length = 12; int vector_a[12] = {123, 5, 36, 65, 13, 66, 21, 93, 3, 1, 7 , 8}; unsigned long b_length = 10; double vector_b[10] = {0.1, 1.6, 56.2, 33.7, 0.5, 0.9, 6.3, 3.1, 5.2, 11.9}; //Sortieren und ausgeben des int vektors sort( (void*)vector_a, a_length, sizeof(int), &compare_int, &swap_int ); printf("Sortierter int vektor:\n"); for(i=0; i < a_length; i++) { printf("%3d ", vector_a[i]); } printf("\n"); //Sortieren und ausgeben des double vektors sort( (void*)vector_b, b_length, sizeof(double), &compare_double, &swap_double ); printf("Sortierter double vektor:\n"); for(i=0; i < b_length; i++) { printf("%5.2lf ", vector_b[i]); } printf("\n"); return 0; }