4.1 泛型函数LinearSearch()
void *LinearSearch (void *key, void *array,
uint8_t len, uint8_t elemSize,
int (*cmpFn)(void *, void *))
{
uint8_t i;
void *elemAddr;
for(i = 0; i < len; i++) {
elemAddr = (char *)array + i * elemSize;
if ( 0 == cmpFn(key, elemAddr) ) {
return elemAddr;
};
};
return NULL;
}
int CharCmp ( void *elem1, void *elem2 )
{
char *ip1 = elem1;
char *ip2 = elem2;
return (*ip1 - *ip2);
}
int IntCmp ( void *elem1, void *elem2 )
{
int *ip1 = elem1;
int *ip2 = elem2;
return (*ip1 - *ip2);
}
int FloatCmp ( void *elem1, void *elem2 )
{
float *if1 = elem1;
float *if2 = elem2;
return (int)(*if1 - *if2);
}
int StrCmp ( void *elem1, void *elem2 )
{
char *iStr1 = *(char **)elem1;
char *iStr2 = *(char **)elem2;
return strcmp(iStr1, iStr2);
}
4.2 测试
4.2.1 对整型数组的线性搜索
int main(void)
{
int test_i[] = {11,2,5,124,65,1};
int key_i = 5;
void *found;
printf(">>> array test_i starting address: %x -----\r\n", test_i);
found = LinearSearch(&key_i, test_i,
sizeof(test_i)/sizeof(int), sizeof(int),
IntCmp);
if ( NULL != found ) {
printf("Address = %x, founded: %d \r\n", found, *(int *)found);
} else {
printf("not founded!!!\r\n");
}
return 0;
}
4.2.2 对字符型数组的线性搜索
int main()
{
char test_str_array[] = "abcdefg";
char key_char = 'e';
void *found;
printf(">>> array test_str_array starting address: %x -----\r\n", test_str_array);
found = LinearSearch(&key_char, test_str_array,
sizeof(test_str_array)/sizeof(char), sizeof(char),
CharCmp);
if ( NULL != found ) {
printf("Address = %x, founded: %c \r\n", found, *(char *)found);
} else {
printf("not founded!!!\r\n");
}
return 0;
}
4.2.3 对指针数组的线性搜索
int main(void)
{
char *test_str[] = {"Ab", "F#", "B", "Gb", "D"};
char *key_str = "Gb";
void *found;
printf(">>> array test_str starting address: %x -----\r\n", test_str);
found = LinearSearch(&key_str, test_str,
sizeof(test_str)/sizeof(char *), sizeof(char *),
StrCmp);
if ( NULL != found ) {
printf("Address = %x, founded: %s \r\n", found, *(char **)found);
} else {
printf("not founded!!!\r\n");
}
return 0;
}