Provided by:
manpages-de-dev_0.10-1_all 
BEZEICHNUNG
hcreate, hdestroy, hsearch - hash table management
Diese Handbuchseite ist eventuell veraltet. Im Zweifelsfall ziehen Sie
die englischsprachige Handbuchseite zu Rate, indem Sie
man -LC 3 hsearch
eingeben.
"UBERSICHT
#include <search.h>
ENTRY *hsearch(ENTRY item, ACTION action);
int hcreate (unsigned nel);
void hdestroy (void);
BESCHREIBUNG
Diese drei Funktionen erlauben dem Anwender eine Hashtabelle
anzulegen, die einen Schlussel mit irgendwelchen Daten verbindet.
Zuerst muss die Tabelle mit hcreate() erzeugt werden. nel ist die
geschatzte GroBe der Tabelle. hcreate() kann diesen Wert nach oben
korrigieren, um die Performance des Algorithmus zu verbessern. Die
GNU-Implementierung von hsearch() wird die Tabelle ebenfalls
verlangern, wenn sie fast voll ist. malloc(3) wird verwendet, um
Speicherplatz zu alloziieren.
Die entsprechende Funktion hdestroy() gibt den Speicher wieder frei,
der von der Hashtabelle belegt wurde, um so Platz fur eine neue Tabelle
zu schaffen.
item ist vom Typ ENTRY, der in <search.h> definiert wurde und folgende
Elemente enth"alt:
typedef struct entry
{
char *key;
char *data;
} ENTRY;
key zeigt auf eine null-terminierte ASCII-Zeichenkette, die den
Suchschlussel reprasentiert. data zeigt auf das Datum, das mit dem
Schlussel verbunden ist. (Ein Zeiger auf einen anderen Typ als char
sollte auf einen char * gecastet werden.) hsearch() sucht nach item in
der Hashtabelle und gibt bei Erfolg einen Zeiger darauf zuruck,
ansonsten NULL. action bestimmt, wie sich hsearch() nach erfolgloser
Suche verhalt. Der Wert ENTER bewirkt, dass item in die Tabelle
eingefugt wird, wahrend der Wert FIND hsearch() anweist NULL
zuruckzugeben.
R"UCKGABEWERT
hcreate() gibt NULL zuruck, wenn die Hashtabelle nicht erfolgreich
angelegt werden konnte.
hsearch() gibt NULL zuruck, wenn action ENTER ist und nicht ausreichend
Speicher zur Verfugung steht, um die Hashtabelle zu erweitern, oder
wenn action FIND ist und item nicht in der Tabelle gefunden werden
konnte.
KONFORM ZU
SVID, auBer, dass die Tabelle bei SysV nicht wachsen kann.
FEHLER
Diese Implementierung kann nur eine Hashtabelle zur gleichen Zeit
verwalten. Einzelne Eintrage konnen hinzugefugt, jedoch nicht geloscht
werden.
BEISPIEL
Das folgende Programm fugt 24 Eintrage in die Hashtabelle ein und zeigt
dann einige.
#include <stdio.h>
#include <search.h>
char *data[]={ "alpha", "bravo", "charley", "delta",
"echo", "foxtrot", "golf", "hotel", "india", "juliette",
"kilo", "lima", "mike", "november", "oscar", "papa",
"quebec", "romeo", "sierra", "tango", "uniform",
"victor", "whiskey", "x-ray", "yankee", "zulu"
};
int main()
{
ENTRY e, *ep;
int i;
/* Fang mit einer kleinen Tabelle an und laB sie wachsen */
hcreate(3);
for (i = 0; i < 24; i++)
{
e.key = data[i];
/* Datum ist nur eine Ganzzahl anstelle eines Zeigers auf
irgendetwas */
e.data = (char *)i;
ep = hsearch(e, ENTER);
/* Es sollte keine Fehler geben */
if(ep == NULL) {fprintf(stderr, "entry failed\n"); exit(1);}
}
for (i = 22; i < 26; i++)
/* Gib zwei Eintrage der Tabelle aus und zeige, dass zwei nicht
in der Tabelle enthalten sind */
{
e.key = data[i];
ep = hsearch(e, FIND);
printf("%9.9s -> %9.9s:%d\n", e.key, ep?ep->key:"NULL",
ep?(int)(ep->data):0);
}
return 0;
}
SIEHE AUCH
bsearch(3), lsearch(3), tsearch(3), malloc(3).