int hcreate(size_t nel);
ENTRY *hsearch(ENTRY item, ACTION action);
void hdestroy(void);
#define _GNU_SOURCE
#include <search.h>
int hcreate_r(size_t nel, struct hsearch_data *tab);
int *hsearch_r(ENTRY item, ACTION action, ENTRY **ret, struct hsearch_data *tab);
void hdestroy_r(struct hsearch_data *tab);
Во-первых, хэш должен быть создан с помощью функции hcreate(). Аргумент nel указывает предполагаемое максимальное количество элементов в хэше. Функция hcreate() может увеличить этот параметр для повышения быстродействия таблицы.
Соответствующая функция hdestroy() освобождает память, занимаемую таблицей.
Аргумент item имеет тип ENTRY, который определен в <search.h> следующим образом:
typedef struct entry {
char *key;
void *data;
} ENTRY;
Поле key указывает на оканчивающуюся NUL строку, используемую в качестве ключа для поиска. Поле data указывает на данные, связанные с ключом. Функция hsearch() ищет в хэше элемент с ключом, равным item (равенство определяется функцией strcmp(3)), и в случае удачного завершения операции возвращает указатель на него. Аргумент action определяет действие, вызываемое из hsearch() после неудачного поиска. Значение ENTER указывает, что копия item будет вставляться в хэш до того момента, пока FIND не перестанет возвращать NULL.
Функция hsearch_r() возвращает 0, если action равен ENTER и хэш полон, иначе возвращается ненулевое значение.
Отдельные записи в хэше могут быть добавлены, но не удалены.
Следующая программа вставляет в таблицу 24 элемента, а затем выводит на печать некоторые из них:
#include <stdio.h>
#include <search.h>
char *data[] = { "alpha", "bravo", "charlie", "delta",
"echo", "foxtrot", "golf", "hotel", "india", "juliet",
"kilo", "lima", "mike", "november", "oscar", "papa",
"quebec", "romeo", "sierra", "tango", "uniform",
"victor", "whisky", "x-ray", "yankee", "zulu"
};
int main() {
ENTRY e, *ep;
int i;
/* начать с небольшой таблицы и позволить ей увеличиваться не получится */
hcreate(30);
for (i = 0; i < 24; i++) {
e.key = data[i];
/* данные - это просто целые числа, а не указатели
на что-либо */
e.data = (char *)i;
ep = hsearch(e, ENTER);
/* ошибок быть не должно */
if(ep == NULL) {
fprintf(stderr, "ошибка\n");
exit(1);
}
}
for (i = 22; i < 26; i++) {
/* напечатать два значения из таблицы и их значения не из таблицы */
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;
}
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |