|
HSEARCH(3C)НАЗВАНИЕ СИНТАКСИС #include <search.h> ENTRY *hsearch (item, action) ENTRY item; ACTION action; int hcreate (nel) unsigned nel; void hdestroy ( ) ОПИСАНИЕ Функция hsearch возвращает указатель внутрь таблицы на искомые данные. Аргумент item - это структура типа ENTRY (определенная во включаемом файле <search.h>), содержащая два указателя: item.key указывает на сравниваемый ключ, а item.data указывает на любые дополнительные данные, ассоциированные с этим ключом. Указатели на переменные типов, отличных от символьного, следует преобразовывать к типу "указатель на символ". Аргумент action имеет тип ACTION и задает способ действий в случае неудачного поиска: значение ENTER означает, что искомый элемент следует поместить в таблицу; значение FIND означает, что в случае неудачи нужно вернуть пустой указатель NULL. Функция hcreate выделяет достаточное количество пространства для таблицы и должна вызываться перед использованием функции hsearch. Значением переменной nel является ожидаемое максимальное количество элементов таблицы. Это число можно взять с запасом, чтобы уменьшить среднее время поиска. Функция hdestroy ликвидирует таблицу поиска, за вызовом этой функции может следовать последующий вызов функции создания таблицы hcreate. ПРИМЕЧАНИЯ
Кроме того, есть флаги препроцессора для получения отладочной печати (-DDEBUG) и для включения драйвера отладки в вызываемую функцию (-DDRIVER). Для получения более детальной информации следует обратиться к исходному тексту функции. ПРИМЕР #include <stdio.h> #include <search.h> struct info { /* Дополнительная информация, ас- социированная с ключом */ int age, room; }; #define NUM_EMPL 5000 /* Количество элементов в таблице поиска */ main () { /* Массив для размещения цепочек символов */ char string_space [NUM_EMPL*20]; /* Массив для размещения информации о служащих */ struct info info_space [NUM_EMPL]; /* Указатель на свободное место в массиве цепочек */ char *str_ptr = string_space; /* Указатель на свободное место в массиве служащих */ struct info *info_ptr = info_space; ENTRY item, *found_item, *hsearch (); char name_to_find [30]; /* Искомое имя */ int i; /* Создать таблицу */ (void) hcreate (NUM_EMPL); /* Цикл чтения исходной информации */ while (scanf ("%s%d%d", str_ptr, &info_ptr->age, &info_ptr->room) != EOF && i++ < NUM_EMPL) { /* Сформировать элемент таблицы */ item.key = str_ptr; item.data = (char *) info_ptr; str_ptr += strlen (str_ptr) + 1; info_ptr++; /* Поместить элемент в таблицу */ (void) hsearch(item, ENTER); }; /* Доступ к таблице */ item.key = name_to_find; while (scanf ("%s", item.key) != EOF) { if ((found_item = hsearch (item, FIND)) != NULL) { /* Если элемент найден в таблице */ (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) } } } СМ. ТАКЖЕ ДИАГНОСТИКА ПРЕДОСТЕРЕЖЕНИЯ ОГРАНИЧЕНИЯ |
|