Originální popis anglicky:
hcreate, hdestroy, hsearch - manage hash search table
Návod, kniha: POSIX Programmer's Manual
#include <search.h>
int hcreate(size_t
nel);
void hdestroy(void);
ENTRY *hsearch(ENTRY
item, ACTION
action );
The
hcreate(),
hdestroy(), and
hsearch() functions shall
manage hash search tables.
The
hcreate() function shall allocate sufficient space for the table, and
the application shall ensure it is called before
hsearch() is used. The
nel argument is an estimate of the maximum number of entries that the
table shall contain. This number may be adjusted upward by the algorithm in
order to obtain certain mathematically favorable circumstances.
The
hdestroy() function shall dispose 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
hsearch() function is a hash-table search routine. It shall return a
pointer into a hash table indicating the location at which an entry can be
found. The
item argument is a structure of type
ENTRY (defined
in the
<search.h> header) containing two pointers:
item.key points to the comparison key (a
char *), and
item.data (a
void *) points to any other data to be associated
with that key. The comparison function used by
hsearch() is
strcmp(). The
action argument is a member of an enumeration type
ACTION indicating the disposition of the entry if it cannot be found in
the table. ENTER indicates that the 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.
These functions need not be reentrant. A function that is not required to be
reentrant is not required to be thread-safe.
The
hcreate() function shall return 0 if it cannot allocate sufficient
space for the table; otherwise, it shall return non-zero.
The
hdestroy() function shall not return a value.
The
hsearch() function shall return a null pointer if either the action
is FIND and the item could not be found or the action is ENTER and the table
is full.
The
hcreate() and
hsearch() functions may fail if:
- ENOMEM
- Insufficient storage space is available.
The following sections are informative.
The following example reads in strings followed by two numbers and stores them
in a hash table, discarding duplicates. It then reads in strings and finds the
matching entry in the hash table and prints it out.
#include <stdio.h>
#include <search.h>
#include <string.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 string_space[NUM_EMPL*20]; /* Space to store strings. */
struct info info_space[NUM_EMPL]; /* Space to store employee info. */
char *str_ptr = string_space; /* Next space in string_space. */
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_ptr, &info_ptr->age,
&info_ptr->room) != EOF && i++ < NUM_EMPL) {
/* Put information in structure, and structure in item. */
item.key = str_ptr;
item.data = info_ptr;
str_ptr += strlen(str_ptr) + 1;
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);
}
return 0;
}
The
hcreate() and
hsearch() functions may use
malloc() to
allocate space.
None.
None.
bsearch() ,
lsearch() ,
malloc() ,
strcmp() ,
tsearch() , the Base Definitions volume of
IEEE Std 1003.1-2001,
<search.h>
Portions of this text are reprinted and reproduced in electronic form from IEEE
Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable
Operating System Interface (POSIX), The Open Group Base Specifications Issue
6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics
Engineers, Inc and The Open Group. In the event of any discrepancy between
this version and the original IEEE and The Open Group Standard, the original
IEEE and The Open Group Standard is the referee document. The original
Standard can be obtained online at http://www.opengroup.org/unix/online.html
.