c针对所有数据类型的通用搜索

程序设计范式二

不同的数据类型,用 同样的 memcmp 实现比较,对于较为复杂的数据结构,如数组、结构体等会失去通用性。
每种数据类型,其数据比较方式可能会不同。例如,两个整数比较,两数相减,看结果是 0 还是正负数就可以比较其大小。两个字符串的比较,则可用 strcmp 进行比较。
通用搜索函数的解决方案之一是再增加一个参数,用于传入特定数据类型的比较函数。函数原型:

             void* search( void* a, void* k, int n , int m,

                                    int (*compare)(void *, void *) );

compare 是一个指向某函数的指针。
compare 所指向的函数是一个比较函数,带两个 void * 参数(表示不知道要比较的数据类型是什么),返回一个整型数据(用于判断两个数值的大小)。
#include<iostream>
#include <cstring>
void* search(void* a,void* k,int n,int m,int (*compare)(void *,void*)){
	for(int i=0;i<n;i++){
		void* addr=(char *)a+i*m;
		if(compare(addr,k)==0)
			return addr;
	}
	return NULL;
}
int cmp_int(void* x,void* y){
	int* p1=(int *)x;
	int* p2=(int *)y;
	return *p1-*p2;
}
int cmp_string(void* x,void* y){
	char* p1=*(char**)x;
	char* p2=*(char**)y;
	return strcmp(p1,p2); 
}
int main(){
	int arr[]={36,72,1,83,6,87,10,19};
	int len=8;
	int key=87;
	int *ret=(int *)search(arr,&key,len,sizeof(int),cmp_int);
	std::cout <<ret<< ": " << *ret << std::endl;  
	char* books[]={"水浒传","三国演义","西游记","红楼梦"};
	char* book="西游记";
	char** ret1=(char **)search(books,&book,4,sizeof(char *),cmp_string);
	std::cout <<ret1<< ": " << *ret1 << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值