lsearch(3C) lsearch(3C)
NAME
lsearch, lfind - Linear suchen und ändern
SYNTAX
#include <search.h>
void *lsearch(const void *key, void * base, sizet *nelp,
sizet width, int (*compar) (const void *, const void *));
void *lfind(const void *key, const void *base, sizet *nelp,
sizet width, int (*compar)(const void *, const void *));
BESCHREIBUNG
lsearch() ist eine lineare Suchfunktion, die eine Verallgemeinerung
des Algorithmus (6.1) S von Knuth ist. Sie gibt einen Zeiger in eine
Tabelle zurück, der die Stelle angibt, an der ein gesuchter Wert
gefunden wurde. Wenn der gesuchte Wert nicht auftritt, wird er am Ende
der Tabelle eingetragen. key zeigt auf den Wert, der in der Tabelle
gesucht werden soll. base zeigt auf das erste Element in der Tabelle.
nelp zeigt auf eine ganze Zahl, die die aktuelle Anzahl der Elemente
in der Tabelle enthält. Die Zahl wird erhöht, wenn der Wert zur
Tabelle hinzugefügt wird. width ist die Größe eines Elements in Bytes.
compar ist ein Zeiger auf die Vergleichsfunktion, die der Benutzer zur
Verfügung stellen muß (strcmp() zum Beispiel). Es werden zwei Argu-
mente erwartet, die auf die Elemente zeigen, die verglichen werden.
Die Funktion gibt 0 zurück, wenn die Elemente gleich sind, sonst
ungleich 0.
lfind() wirkt wie lsearch(), wobei jedoch der gesuchte Wert nicht zur
Tabelle hinzugefügt wird, wenn er nicht gefunden wird. Statt dessen
wird ein Nullzeiger zurückgegeben.
HINWEISE
Die Zeiger auf den Schlüssel und das Element an der Basis der Tabelle
können Zeiger auf einen beliebigen Typ sein.
Die Vergleichsfunktion muß nicht jedes Byte vergleichen, und so können
die Elemente zusätzlich zu den zu vergleichenden Werten beliebige
Daten enthalten.
Der zurückgegebene Wert sollte sich in den Typ Zeiger-auf-Element
umwandeln lassen.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
lsearch(3C) lsearch(3C)
BEISPIEL
Das folgende Programm liest weniger als TABSIZE Zeichenketten mit
einer Länge kleiner als ELSIZE ein, speichert sie bei gleichzeitiger
Entfernung von Duplikaten in einer Tabelle und gibt dann jeden Eintrag
aus.
#include <search.h>
#include <string.h>
#include <stdio.h>
#define TABSIZE 50
#define ELSIZE 120
...
char line[ELSIZE]; /* Puffer für die Eingabe */
char tab[TABSIZE][ELSIZE]; /* Tabelle der Zeichenketten */
sizet nel = 0; /* Anzahl der Einträge in tab */
...
while (fgets(line, ELSIZE, stdin) != NULL && nel < TABSIZE)
(void) lsearch(line, tab, &nel, ELSIZE,
(int (*) ((const void*, const void*))
strcmp);
...
}
ERGEBNIS
Wird der gesuchte Wert gefunden, geben lsearch() und lfind() einen
Zeiger auf den Wert zurück. Andernfalls gibt lfind NULL zurück und
lsearch() einen Zeiger auf das neu hinzugefügte Element.
Undefinierte Ergebnisse können auftreten, wenn nicht genügend Spei-
cherplatz für ein neues Element vorhanden ist.
SIEHE AUCH
bsearch(3C), hsearch(3C), string(3C), tsearch(3C).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98