home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************/
- /* PRTSORT.C */
- /* Sortroutinen-Demo mit Funktionsparameter */
- /* (C) 1988 M.Schlöter & TOOLBOX */
- /*********************************************************/
-
- #define real float /* ggf. auch double */
- #define MAXINTS 20 /* Größe des Sortierfeldes */
- #define MAXREALS 10
-
- #include <stdio.h>
- #include <stdlib.h> /* Für Zufallszahlen */
-
- /* Prototype von Sort, Parameter s.u. */
- void sort(void *,int,int,
- int (* comp_less)(void *, void *),
- void (* swap)(void *, void *) );
-
- /* Sort selber */
- void sort(f,size,elemsize,comp_less,swap)
-
- void *f; /* Das Feld */
- int size, /* Anzahl Feldelemente */
- elemsize; /* Größe eines Feldelements */
- /* Zeiger auf Vergleichsfunktion */
- int (*comp_less)(void *, void *);
- /* Zeiger auf Tauschfunktion */
- void (*swap)(void *, void *);
-
- {
- int swaped, /* Hat eine Vertauschung stattgefunden ? */
- i; /* Zählvariable */
- void *p1, *p2;/* Zwei Zeiger in das Feld */
-
- do{ /* Feld durchsuchen bis kein Tauschen mehr nötig */
- swaped = 0; /* Nichts mehr zu tauschen ? */
- for(i = 0, p1 = f; i < size-1; i++){
- /* Einmal durch das Feld, p1 zeigt auf f[i], */
- /* p2 zeigt auf f[i+1] */
- p2 = (void *)( (int)p1 + elemsize);/* p2 eins vor p1*/
- if (comp_less(p2,p1)) { /* f[i] > f[i+1] ? */
- swap(p1,p2); /* dann tauschen ! */
- swaped = 1;
- }
- p1 = (void *)( (int)p1 + elemsize);/* p1 eins weiter*/
- }
- } while (swaped);
- }
-
- /* Prototypen der Vergleichs- und Tauschfunktionen */
- int int_compare_less(int *, int *);
- int real_compare_less(real *, real *);
- void int_swap(int *, int*);
- void real_swap(real *, real*);
-
- /* Vergleichsfunktion f. INT's */
- int int_compare_less(p1,p2)
- int *p1, *p2; /* Zeiger auf Integer-Feldelemente */
- {
- return (*p1 < *p2); /* Vergleichen und zurückgeben */
- }
-
-
- /* Vergleichsfunktion f. REAL's */
- int real_compare_less(p1,p2)
- real *p1, *p2; /* Zeiger auf REAL-Feldelemente */
- {
- return (*p1 < *p2); /* Vergleichen und zurückgeben */
- }
-
-
- /* Tauschfunktion f. INT's */
- void int_swap(p1,p2)
- int *p1, *p2;
- {
- int temp;
-
- temp = *p1; /* übliche Tauschoperation */
- *p1 = *p2;
- *p2 = temp;
- }
-
-
- /* Tauschfunktion f. REAL's */
- void real_swap(p1,p2)
- real *p1, *p2;
- {
- real temp;
-
- temp = *p1; /* übliche Tauschoperation */
- *p1 = *p2;
- *p2 = temp;
- }
-
-
- /*---- Hauptprogramm */
- main()
- {
- int int_Feld[MAXINTS];
- real real_Feld[MAXREALS];
- int i;
-
- /* Felder mit Zufallszahlen inititalisieren */
- for(i = 0; i < MAXINTS; i++)
- int_Feld[i] = rand();
- for(i = 0; i < MAXREALS; i++)
- real_Feld[i] = 3.1415 * rand();
-
- printf("Das Integer-Feld vor der Sortierung:\n");
- for(i = 0; i < MAXINTS; i++)
- printf("%10d",int_Feld[i]);
-
- /* Sortierung des INTEGER-Felds */
- sort( int_Feld, MAXINTS, sizeof(int),
- int_compare_less, int_swap);
-
- printf("\n\nDas Integer-Feld NACH der Sortierung:\n");
- for(i = 0; i < MAXINTS; i++)
- printf("%10d",int_Feld[i]);
-
- printf("\n\n\nDas Real-Feld vor der Sortierung:\n");
- for(i = 0; i < MAXREALS; i++)
- printf("%20.5f",real_Feld[i]);
-
- /* Sortierung REAL-Feld, DIESELBE SORTIERROUTINE !!!!! */
- sort( real_Feld, MAXREALS, sizeof(real),
- real_compare_less, real_swap);
-
- printf("\n\nDas Real-Feld NACH der Sortierung:\n");
- for(i = 0; i < MAXREALS; i++)
- printf("%20.5f",real_Feld[i]);
- }
-
-
-