hcreate , hdestroy , hsearch - manage hash search table
Lb libc
The
hcreate ();
function allocates sufficient space for the table, and the application should
ensure it is called before
hsearch ();
is used.
The
Fa nel
argument is an estimate of the maximum
number of entries that the table should contain.
This number may be adjusted upward by the
algorithm in order to obtain certain mathematically favorable circumstances.
The
hdestroy ();
function disposes of the search table, and may be followed by another call to
hcreate (.);
After the call to
hdestroy (,);
the data can no longer be considered accessible.
The
hdestroy ();
function calls
free(3)
for each comparison key in the search table
but not the data item associated with the key.
The
hsearch ();
function is a hash-table search routine.
It returns a pointer into a hash table
indicating the location at which an entry can be found.
The
Fa item
argument is a structure of type
Vt ENTRY
(defined in the
#include <search.h>
header) containing two pointers:
Fa item.key
points to the comparison key (a
Vt char * ) ,
and
Fa item.data
(a
Vt void * )
points to any other data to be associated with
that key.
The comparison function used by
hsearch ();
is
strcmp(3).
The
Fa action
argument is a
member of an enumeration type
Vt ACTION
indicating the disposition of the entry if it cannot be
found in the table.
ENTER
indicates that the
Fa item
should be inserted in the table at an
appropriate point.
FIND
indicates that no entry should be made.
Unsuccessful resolution is
indicated by the return of a
NULL
pointer.
The comparison key (passed to
hsearch ();
as
Fa item.key )
must be allocated using
malloc(3)
if
Fa action
is
ENTER
and
hdestroy ();
is called.
The
hdestroy ();
function does not return a value.
The
hsearch ();
function returns a
NULL
pointer if either the
Fa action
is
FIND
and the
Fa item
could not be found or the
Fa action
is
ENTER
and the table is full.
#include <stdio.h> #include <search.h> #include <string.h> #include <stdlib.h> struct info { /* This is the info stored in the table */ int age, room; /* other than the key. */ }; #define NUM_EMPL 5000 /* # of elements in search table. */ int main(void) { char str[BUFSIZ]; /* Space to read string */ struct info info_space[NUM_EMPL]; /* Space to store employee info. */ struct info *info_ptr = info_space; /* Next space in info_space. */ ENTRY item; ENTRY *found_item; /* Name to look for in table. */ char name_to_find[30]; int i = 0; /* Create table; no error checking is performed. */ (void) hcreate(NUM_EMPL); while (scanf("%s%d%d", str, &info_ptr->age, &info_ptr->room) != EOF && i++ < NUM_EMPL) { /* Put information in structure, and structure in item. */ item.key = strdup(str); item.data = info_ptr; info_ptr++; /* Put item into table. */ (void) hsearch(item, ENTER); } /* Access table. */ item.key = name_to_find; while (scanf("%s", item.key) != EOF) { if ((found_item = hsearch(item, FIND)) != NULL) { /* If item is in the table. */ (void)printf("found %s, age = %d, room = %d\n", found_item->key, ((struct info *)found_item->data)->age, ((struct info *)found_item->data)->room); } else (void)printf("no such employee %s\n", name_to_find); } hdestroy(); return 0; }
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |