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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。