Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ hsearch(3C) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

bsearch(3C)

lsearch(3C)

malloc(3C)

string(3C)

tsearch(3C)

malloc(3X)

hsearch(3C)                                                     hsearch(3C)

NAME
     hsearch, hcreate, hdestroy - Hash-Suchtabellen verwalten

SYNTAX
     #include <search.h>

     ENTRY *hsearch(ENTRY item, ACTION action);

     int hcreate(sizet nel);

     void hdestroy(void);

BESCHREIBUNG
     hsearch() ist eine auf der Grundlage des Algorithmus D (6.4) von Knuth
     verallgemeinerte Suchfunktion für Hash-Tabellen. Sie gibt einen Zeiger
     in eine Hash-Tabelle zurück, der die Stelle anzeigt, an der ein Ein-
     trag gefunden wurde. Die von hsearch() benutzte Vergleichsfunktion ist
     strcmp() [siehe string(3C)]. item ist eine Struktur des in der
     Include-Datei search.h definierten Typs ENTRY, die zwei Zeiger ent-
     hält: item.key weist auf den Vergleichsschlüssel (vom Typ char*), und
     item.data (void*) weist auf alle anderen Daten in Zusammenhang mit
     diesem Schlüssel. Zeiger auf Typen, die nicht void sind, sind zu Zei-
     gern auf void umzuwandeln. action ist ein Element des Aufzählungstyps
     ACTION (definiert in search.h), das die Behandlung des Eintrags
     angibt, wenn dieser nicht in der Tabelle gefunden werden kann. ENTER
     zeigt an, daß item an einem geeigneten Punkt in die Tabelle eingetra-
     gen werden soll. Ist ein Duplikat eines existierenden Eintrags vorhan-
     den, so wird der neue Eintrag nicht eingetragen, und hsearch() gibt
     den Zeiger zu dem existierenden Eintrag zurück. FIND zeigt an, daß
     kein Eintrag vorgenommen werden soll. Eine erfolglose Suche wird durch
     die Rückgabe eines Nullzeigers gemeldet.

     hcreate() weist ausreichend Speicher für die Tabelle zu und muß vor
     hsearch() aufgerufen werden. nel schätzt die größtmögliche Anzahl von
     Einträgen, die eine Tabelle enthalten wird. Diese Zahl kann durch den
     Algorithmus nach oben justiert werden, damit bestimmte, mathematisch
     günstige Umstände erreicht werden.

     hdestroy() zerstört die Suchtabelle. Ein weiterer Aufruf von hcreate()
     kann folgen.

     Die Funktionen schlagen fehl, wenn:

     ENOMEM    Es ist nicht genügend Speicherplatz vorhanden.

BEISPIELE
     Im folgenden Beispiel werden Zeichenketten, gefolgt von zwei Zahlen,
     eingelesen und in einer Hash-Tabelle gespeichert, wobei Duplikate
     gelöscht werden. Anschließend werden Zeichenketten eingelesen und der
     übereinstimmende Eintrag in der Hash-Tabelle gesucht und ausgedruckt.





Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

hsearch(3C)                                                     hsearch(3C)

     #include <stdio.h>
     #include <search.h>
     #include <string.h>

     struct info { /* dies sind die in der Tabelle gespeicherten */
           int age, room;  /* Daten außer dem Schlüssel. */
     };

     #define NUMEMPL   5000    /* # der Elemente in Suchtabelle */

     int main(void)
     {
           /* Platz zum Speichern von Zeichenketten */
           char stringspace[NUMEMPL*20];
           /* Platz zum Speichern von Mitarbeiterdaten */
           struct info infospace[NUMEMPL];
           /* nächster verfügbarer Platz im stringspace */
           char *strptr = stringspace;
           /* nächster verfügbarer Platz im infospace */
           struct info *infoptr = infospace;
           ENTRY item, *founditem;
           /* zu suchender Name in Tabelle */
           char nametofind[30];
           int i = 0;

           /* Tabelle erstellen */
           (void) hcreate(NUMEMPL);
           while (scanf("%s%d%d", strptr, &infoptr->age,
                   &infoptr->room) != EOF && i++ <NUMEMPL) {
                   /* Daten in Struktur und Struktur in item setzen */
                   item.key = strptr;
                   item.data = infoptr;
                   strptr += strlen(strptr) + 1;
                   infoptr++;
                   /* item in Tabelle setzen */
                   (void) hsearch(item, ENTER);
           }

           /* auf Tabelle zugreifen */
                   item.key = nametofind;
                   while (scanf("%s", item.key) != EOF) {
                      if ((founditem = hsearch(item, FIND)) != NULL) {
                          /* wenn item in Tabelle ist */
                          (void)printf("found %s, age = %d, room = %d\n"
                              founditem->key,
                               ((struct info *)founditem->data)->age,
                               ((struct info *)founditem->data)->room);
                      } else
                          (void)printf("diesen Mitarbeiter gibt es nicht:
                                %s\n", nametofind)
                   }
           return 0;


Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

hsearch(3C)                                                     hsearch(3C)

     }

ERGEBNIS
     hsearch() gibt einen Nullzeiger zurück, wenn die Aktion FIND (suchen)
     ist und der Eintrag nicht gefunden werden konnte oder wenn die Aktion
     ENTER (eintragen) ist und die Tabelle voll ist.

     hcreate() gibt Null zurück, wenn es nicht genug Speicherplatz für die
     Tabelle zuweisen kann.

HINWEISE
     hsearch() und hcreate() verwenden malloc(3C) um Speicherplatz zuzuwei-
     sen.

     Es kann jeweils nur eine Hash-Suchtabelle aktiv sein.

SIEHE AUCH
     bsearch(3C), lsearch(3C), malloc(3C), string(3C), tsearch(3C),
     malloc(3X).



































Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026