// Time-stamp: "(13.05.02 22:33) suchestud.c [Klaus@Wachtler.de]" /* 1 */ // demonstriert generisches Programmieren (hier: Suche in einem /* 2 */ // Feld mit unbekannten Datentypen) in Anlehnung an bsearch() /* 3 */ // aus der Standardbibliothek von ANSI-C. /* 4 */ // /* 5 */ // Literatur: /* 6 */ // [1] "0 ist false, alles andere true" /* 7 */ // Klaus Wachtler 2002 /* 8 */ /* 9 */ #include <stdlib.h> /* 10 */ #include <stddef.h> /* 11 */ #include <stdio.h> /* 12 */ /* 13 */ // Lineare Suche in einem Feld von Werten unbekannten Inhalts; /* 14 */ // entnommen aus [1]; /* 15 */ // Aufruf identisch zu bsearch() aus der Standardbibliothek /* 16 */ // (allerdings muß das Feld nicht sortiert sein, da lineare /* 17 */ // Suche): /* 18 */ void *lsearch( const void *schluessel, /* 19 */ const void *feldanfang, /* 20 */ size_t elemente, /* 21 */ size_t elementgroesse, /* 22 */ int(* vergleichsfkt)( const void *e1, /* 23 */ const void *e2 /* 24 */ ) /* 25 */ ) /* 26 */ { /* 27 */ char *feld_p = (char *)feldanfang; /* 28 */ /* 29 */ /* Parameter pruefen: */ /* 30 */ if( !( schluessel /* 31 */ && feldanfang /* 32 */ && elemente /* 33 */ && elementgroesse /* 34 */ && vergleichsfkt /* 35 */ ) /* 36 */ ) /* 37 */ return NULL; /* 38 */ /* 39 */ /* Schleife ueber alle Elemente: */ /* 40 */ while( elemente-- ) /* 41 */ { /* 42 */ /* trifft das aktuelle Element zu? */ /* 43 */ if( !(*vergleichsfkt)( schluessel, feld_p ) ) /* 44 */ return feld_p; /* 45 */ /* Wenn nicht, dann naechstes Element: */ /* 46 */ feld_p += elementgroesse; /* 47 */ } /* 48 */ /* 49 */ /* Ende des Feldes und trotzdem nichts gefunden? */ /* 50 */ return NULL; /* 51 */ } /* 52 */ /* 53 */ /* 54 */ // Testprogramm /* 55 */ // ------------ /* 56 */ // /* 57 */ /* 58 */ /* Datentyp für einen Studenten: */ /* 59 */ typedef struct /* 60 */ { /* 61 */ char *vname; /* 62 */ char *nname; /* 63 */ int matrikelnummer; /* 64 */ } /* 65 */ student_t; /* 66 */ /* 67 */ // Vergleichsfunktion für zwei Studenten (liefert einen Wert /* 68 */ // kleiner 0, wenn die Matrikelnummer des ersten kleiner ist /* 69 */ // als die des zweiten, oder 0, wenn beide gleich sind, sonst /* 70 */ // einen Wert >0): /* 71 */ // /* 72 */ int vergleiche_student_t_matrikelnummer( const void *p1, /* 73 */ const void *p2 /* 74 */ ) /* 75 */ { /* 76 */ return ( ((student_t*)p1)->matrikelnummer /* 77 */ - /* 78 */ ((student_t*)p2)->matrikelnummer /* 79 */ ); /* 80 */ } /* 81 */ /* 82 */ int main( int nargs, char **args ) /* 83 */ { /* 84 */ /* Feld mit ein paar Studenten: */ /* 85 */ student_t studenten[5] = /* 86 */ { /* 87 */ { "Kurt", "Pappnase", 978123 }, /* 88 */ { "Hein", "Meier", 987456 }, /* 89 */ { "Fritz", "Schmidt", 998159 }, /* 90 */ { "Klaus", "Lahm", 988123 }, /* 91 */ { "Sina", "Flink", 977111 }, /* 92 */ }; /* 93 */ /* 94 */ /* Zeiger auf gefundenes Element: */ /* 95 */ student_t *p_student = NULL; /* 96 */ /* 97 */ /* Schlüssel, nach dem gesucht wird (VN+NN egal): */ /* 98 */ student_t key = { "", "", -1 }; /* 99 */ /* 100 */ /* Suche nach Student mit der Matrikelnummer 988123: */ /* 101 */ key.matrikelnummer = 988123; /* 102 */ p_student = lsearch( &key, /* 103 */ studenten, /* 104 */ sizeof(studenten)/sizeof(studenten[0]), /* 105 */ sizeof(studenten[0]), /* 106 */ vergleiche_student_t_matrikelnummer /* 107 */ ); /* 108 */ /* 109 */ if( p_student==NULL ) /* 110 */ { /* 111 */ printf( "nichts gefunden!\n" ); /* 112 */ } /* 113 */ else /* 114 */ { /* 115 */ printf( "gefunden: %s %s %d\n", /* 116 */ p_student->vname, /* 117 */ p_student->nname, /* 118 */ p_student->matrikelnummer /* 119 */ ); /* 120 */ } /* 121 */ /* 122 */ return 0; /* 123 */ } /* main( int nargs, char **args */ /* 124 */