Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ bsearch(3C) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

hsearch(3C)

lsearch(3C)

qsort(3C)

tsearch(3C)

bsearch(3C)                                                     bsearch(3C)

NAME
     bsearch - Sortierte Tabelle binär absuchen

SYNTAX
     #include <stdlib.h>

     void *bsearch(const void *key, const void *base, sizet nel,
           sizet size, int (*compar)(const void *, const void *));

BESCHREIBUNG
     bsearch() ist eine binäre Suchfunktion, eine verallgemeinerte Version
     des Algorithmus (6.2.1) B von Knuth. Sie gibt einen Zeiger zurück, der
     auf die Stelle in der Tabelle (im Feld) zeigt, an der ein gegebener
     Wert gefunden werden kann. Sie gibt einen Nullzeiger zurück, falls der
     Wert nicht gefunden werden kann. key weist auf einen Bezugswert, der
     in der Tabelle zu suchen ist. base weist auf das Element am Anfang der
     Tabelle. nel ist die Anzahl der Elemente in der Tabelle. Die Funktion,
     auf die compar zeigt, wird mit zwei Argumenten aufgerufen, die auf key
     und auf ein Element der Tabelle (in dieser Reihenfolge) zeigen. Die
     Funktion muß eine ganze Zahl liefern, die kleiner, gleich oder größer
     als Null ist, je nachdem, ob das erste Argument kleiner, gleich oder
     größer als das zweite Argument ist. Die Tabelle muß folgende Elemente
     enthalten: erst alle Elemente, die kleiner als key sind, dann alle
     Elemente, die gleich und schließlich alle Elemente, die größer als key
     sind.

BEISPIELE
     In diesem Beispiel wird eine Tabelle durchsucht, die Zeiger auf Knoten
     enthält, die aus einer Zeichenkette und ihrer Länge bestehen. Die
     Tabelle ist alphabetisch nach der Zeichenkette im Knoten geordnet, auf
     die jeder Eintrag zeigt.

     Dieses Programm liest Zeichenketten ein und findet entweder den ent-
     sprechenden Knoten und gibt die Zeichenkette und die Länge aus, oder
     es gibt eine Fehlermeldung aus.

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

     struct node {                 /* Diese werden in der Tabelle */
           char *string;           /* gespeichert */
           int length;
     };
     static struct node table[] =  /* zu durchsuchende Tabelle */
     {
          { "asparagus", 10 },
          { "beans", 6 },
          { "tomato", 7 },
          { "watermelon", 11 },
     };




Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

bsearch(3C)                                                     bsearch(3C)

     main()
     {
           struct node *nodeptr, node;
           /* Routine um zwei Konten zu vergleichen */
           static int nodecompare(const void *, const void *);
           char strspace[20]; /* Speicherplatz zum Einlesen der
                                  Zeichenkette */
           node.string = strspace;
           while (scanf("%20s", node.string) != EOF) {
                   nodeptr = bsearch( &node,
                              table, sizeof(table)/sizeof(struct node),
                              sizeof(struct node), nodecompare);
                   if (nodeptr != NULL) {
                           (void) printf("string = %20s, length = %d\n"
                                   nodeptr->string, nodeptr->length);
                   } else {
                           (void)printf("not found: %20s\n", node.string)
                   }
           }
           return(0);
     }

     /* Diese Routine vergleicht zwei Knoten auf Grundlage einer */
     /* alphabetischen Ordnung des Zeichenkettenfelds */
     static int
     node_compare(const void *node1, const void *node2)
     {
           return (strcoll(
                           ((const struct node *)node1)->string,
                           ((const struct node *)node2)->string));
     }

ERGEBNIS
     Ein Nullzeiger wird zurückgegeben, wenn das gesuchte Element nicht in
     der Tabelle gefunden werden kann, sonst wird ein Zeiger, der auf die
     Stelle in der Tabelle zeigt, zurückgegeben.

HINWEISE
     Die Zeiger auf key und das Element am Anfang der Tabelle sollten vom
     Typ "Zeiger-auf-Element" sein.

     Die Vergleichsfunktion muß nicht jedes Byte vergleichen, deshalb kön-
     nen die Elemente zusätzlich zu den Vergleichswerten willkürliche Daten
     enthalten.

     Wenn die Anzahl von Elementen in der Tabelle kleiner als die für die
     Tabelle reservierte Größe ist, sollte nel die kleinere Zahl sein.

SIEHE AUCH
     hsearch(3C), lsearch(3C), qsort(3C), tsearch(3C).




Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

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