筑基_C_4_对数组的线性搜索

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;    // pointer arithmetic 定位
        if ( 0 == cmpFn(key, elemAddr) ) {
            return elemAddr;
        };
    };

    return NULL;
}
int CharCmp ( void *elem1, void *elem2 )
{
    char *ip1 = elem1;  // dereference 进行数据处理
    char *ip2 = elem2;
    return (*ip1 - *ip2);
}

int IntCmp ( void *elem1, void *elem2 )
{
    int *ip1 = elem1;  // dereference 进行数据处理
    int *ip2 = elem2;
    return (*ip1 - *ip2);
}

int FloatCmp ( void *elem1, void *elem2 )
{
    float *if1 = elem1;  // dereference 进行数据处理
    float *if2 = elem2;
    return (int)(*if1 - *if2);
}

int StrCmp ( void *elem1, void *elem2 )
{
    char *iStr1 = *(char **)elem1;  // dereference 进行数据处理
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值