C语言stdlib头文件(stdlib.h)中bsearch函数的用法及代码示例。
用法:
void* bsearch (const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*,const void*));
数组中的二进制搜索
void*
指向匹配元素的指针(如果找到)。为了执行搜索,该函数对进行了一系列调用compar和key作为第一个参数和数组所指向的元素base作为第二个论点。
由于可以优化此函数以使用非线性搜索算法(大概是二进制搜索),因此比较的元素少于key使用compar应该在比较比较相等的数据之前,而在比较比较较大的数据之前。任何以相同的条件排序的阵列都可以满足此要求compar(好像与qsort)。
参数
- key
- 指向用作搜索关键字的对象的指针,type-casted指向
void*
。 - base
- 指向执行搜索的数组的第一个对象的指针,type-casted指向
void*
。 - num
- 指向的数组中的元素数base。
size_t是无符号整数类型。 - size
- 数组中每个元素的大小(以字节为单位)。
size_t是无符号整数类型。 - compar
- 指向比较两个元素的函数的指针。
该函数被重复调用bsearch比较key针对中的个别元素base。它应遵循以下原型:
int compar (const void* pkey, const void* pelem);
以两个指针作为参数:第一个总是key,第二个指向数组的元素(两者均为type-castedconst void*
)。该函数应返回(以稳定且可传递的方式):
返回值 意义 <0
指向的元素pkey在由指向的元素之前pelem 0
指向的元素pkey等效于所指向的元素pelem >0
指向的元素pkey跟随由指向的元素pelem
对于可以使用常规关系运算符进行比较的类型,一般compar函数可能看起来像:
1
2
3
4
5
6int compareMyType (const void * a, const void * b) { if ( *(MyType*)a < *(MyType*)b ) return -1; if ( *(MyType*)a == *(MyType*)b ) return 0; if ( *(MyType*)a > *(MyType*)b ) return 1; }
返回值
指向数组中与搜索匹配的条目的指针key。如果有多个匹配元素(即,compar会回来0
),则可能指向其中任何一个(不一定是第一个)。如果key找不到,则返回空指针。
示例
/* bsearch example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort, bsearch, NULL */
int compareints (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int values[] = { 50, 20, 60, 40, 10, 30 };
int main ()
{
int * pItem;
int key = 40;
qsort (values, 6, sizeof (int), compareints);
pItem = (int*) bsearch (&key, values, 6, sizeof (int), compareints);
if (pItem!=NULL)
printf ("%d is in the array.\n",*pItem);
else
printf ("%d is not in the array.\n",key);
return 0;
}
在这个例子中compareints比较两个参数所指向的值,如下所示:
int
值,并返回减去其指向值的结果,从而得出0
如果它们相等,则结果为正,如果所指向的值为正,则结果为正。a大于b或否定结果(如果由指向的值)b更伟大。在主函数中,目标数组与qsort调用之前bsearch搜索值。
输出:
40 is in the array. |
对于C字符串,strcmp可以直接用作compar争辩bsearch:
/* bsearch example with strings */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort, bsearch, NULL */
#include <string.h> /* strcmp */
char strvalues[][20] = {"some","example","strings","here"};
int main ()
{
char * pItem;
char key[20] = "example";
/* sort elements in array: */
qsort (strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);
/* search for the key: */
pItem = (char*) bsearch (key, strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);
if (pItem!=NULL)
printf ("%s is in the array.\n",pItem);
else
printf ("%s is not in the array.\n",key);
return 0;
}
输出:
example is in the array. |
相关用法
- C语言 atof用法及代码示例
- C语言 atoi用法及代码示例
- C语言 atol用法及代码示例
- C语言 atoll用法及代码示例
- C语言 strtod用法及代码示例
- C语言 strtof用法及代码示例
- C语言 strtol用法及代码示例
- C语言 strtold用法及代码示例
- C语言 strtoll用法及代码示例
- C语言 strtoul用法及代码示例
- C语言 strtoull用法及代码示例
- C语言 rand用法及代码示例
- C语言 srand用法及代码示例
- C语言 calloc用法及代码示例
- C语言 free用法及代码示例
- C语言 malloc用法及代码示例
- C语言 realloc用法及代码示例
- C语言 abort用法及代码示例
- C语言 atexit用法及代码示例
- C语言 at_quick_exit用法及代码示例
- C语言 exit用法及代码示例
- C语言 getenv用法及代码示例
- C语言 quick_exit用法及代码示例
- C语言 system用法及代码示例
- C语言 _Exit用法及代码示例
- C语言 qsort用法及代码示例
- C语言 abs用法及代码示例
- C语言 div用法及代码示例
- C语言 labs用法及代码示例
- C语言 ldiv用法及代码示例
- C语言 llabs用法及代码示例
- C语言 lldiv用法及代码示例
- C语言 mblen用法及代码示例
- C语言 mbtowc用法及代码示例
- C语言 wctomb用法及代码示例
- C语言 wcstombs用法及代码示例
注:本文由纯净天空筛选整理自C标准库大神的英文原创作品 C bsearch function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。