table of contents
bsearch(3) | 2007-10-27-16:31 | bsearch(3) |
НАЗВА ¶
bsearch - бінарний пошук сортованого масиву
ОГЛЯД ¶
<b>#include <stdlib.h></b>
<b>void *bsearch(const void *</b><i>key</i><b>,
const void *</b><i>base</i><b>, size_t </b><i>nmemb</i><b>,</b> <b>size_t </b><i>size</i><b>,
int (*</b><i>compar</i><b>)(const void *, const void *));</b>
ОПИС ¶
Функція bsearch() здійснює пошук по масиву з nmemb об'єктами, base вказуючи на початковий елемент мсиву, на предмет елементу, що співпадає з об'єктом, на який вказує key. Розмір елеметів масиву вказується через size.
Вміст масиву повинен знаходитись у зростаючій сортованій послідовності, згідно з функцією порівнювання, на яку посилається compar. Функція порівнювання, вказана compar очікується, що матиме два аргументи, що показують на ключовий об'єкт і на елемент масиву, саме в цій послідовності і повинна повертати ціле менше, рівне або більше нуля, якщо ключовий об'єкт є, відповідно, меншим за, рівним або більшим за елемент масиву.
ПОВЕРНЕНІ ЗНАЧЕННЯ ¶
Функція bsearch() повертає покажчик на співпадаючий елемент масиву або NULL, якщо співпадання не відбулося. Якщо існує декілька елементів, що співпадають із key, повернений елемент не буде вказано.
ПРИКЛАД ¶
Приклад нижче спочатку сортує масив, використовуючи qsort(3), після чого видобуває бажаний елемент за допомогою bsearch().
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mi {
int nr;
char *name;
} months[] = {
{ 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },
{ 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },
{ 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
};
#define nr_of_months (sizeof(months)/sizeof(months[0]))
static int compmi(const void *m1, const void *m2) {
struct mi *mi1 = (struct mi *) m1;
struct mi *mi2 = (struct mi *) m2;
return strcmp(mi1->name, mi2->name);
}
int main(int argc, char **argv) {
int i;
qsort(months, nr_of_months, sizeof(struct mi), compmi);
for (i = 1; i < argc; i++) {
struct mi key, *res;
key.name = argv[i];
res = bsearch(&key, months, nr_of_months,
sizeof(struct mi), compmi);
if (res == NULL)
printf("'%s': unknown month\n", argv[i]);
else
printf("%s: month #%d\n", res->name, res->nr);
}
return 0;
}
ВІДПОВІДНІСТЬ СТАНДАРТАМ ¶
SVID 3, BSD 4.3, ISO 9899 (C99)
ДИВІТЬСЯ ТАКОЖ ¶
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |