bsearch
Функция Двоичный поиск в массиве.
Синтаксис #include <stdlib.h>
void * bsearch(const void * key, const void * base,
size_t nelem, size_t width,
int (*fcmp) (const void *, const void *));
Файл, содержащий stdlib.h
прототип
Описание bsearch осуществляет поиск по таблице (массиву) из
элементов nelem и возвращает адрес первого элемента
в таблице, который соответствует шаблону поиска.
Если соответствие не найдено, то bsearch возвращает
значение, равное 0. Заметим, что поскольку функция
выполняет двоичный поиск, то первый соответствующий
элемент не обязательно будет первым элементом в
таблице.
Тип size_t определяется как unsigned int.
- nelem задает количество элементов таблицы.
- width задает количество байт в каждом элементе
таблицы.
Функция сравнения fcmp вызывается с двумя
аргументами: elem1 и elem2. Каждый аргумент
указывает на сравниваемый элемент. Функция
сравнения сравнивает элементы, адресуемые
указателями (*elem1 и *elem2) и возвращает целое
значение, зависящее от результатов сравнения.
Для bsearch *fcmp возвращает следующие значения:
< 0 *elem1 < *elem2
==0 *elem1 == *elem2
> 0 *elem1 > *elem2
Возвращаемое bsearch возвращает адрес первого элемента таблицы,
значение соответствующего ключу поиска. Если такого
соответствия не найдено, то возвращается значение,
равное 0.
Переносимость Поддерживается в системах UNIX и определена в
ANSI C.
Смотрите также lfind, lsearch, qsort.
Пример:
#include <stdlib.h>
#include <stdio.h>
#define NELEMS(arr) (sizeof(arr) / sizeoff(arr[0]))
int numarray[] = {123, 145, 512, 627, 800, 993};
int numeric(int *pl, int *p2)
{
return(*p1 - *p2);
}
int lookup(int key)
{
int *itemptr;
/* явное преобразование
необходимо для исключения ошибки несовпадения типов, воз-
никающей во время компиляции */
itemptr = bsearch(&key, numarray, NELEMS(numarray),
sizeof(int), (int (*)(const void *,const void *))numeric);
return (itemptr != NULL);
}
int main(void)
{
if(lookup(512))
printf("В таблице есть элемент 512\n");
else
printf("В таблице нет элемента 512\n");
return 0;
}
|