// 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 */