C语言--通用类型的swap函数和数组线性搜索函数的实现

通用类型的SWAP函数的实现


void swap(void *vp1,void *vp2,int size){ 
	char buffer[size]; 		 //也可用malloc获取一块size大的内存
	memcpy(buffer,vp1,size);
	memcpy(vp1,vp2,size);
	memcpy(vp2,buffer,size);
}
//调用举例
int n1=5,n2=6;
swap(&n1,&n2,sizeof(int));
char *s1="ming",*s2="li";
swap(&s1,&s2,sizeof(char **)); //字符串不等长,不能交换字符串,交换指针

通用类型数组的线性搜索函数的实现

void *lSerch(void *key,void *base,int n,int elemSize){
	void *elemAddr;
	for(int i;i<n;i++){
		elemAddr=(char *)base+i*elemSize;
		if(memcmp(elemAddr,key,elemSize)==0)
			return elemAddr;
	}
	return NULL;
}

上述函数在数组是存储shor,int,long,float,double,char等类型的元素都可用,因为这些类型内存存储长度固定,但对于char *arr[]存储字符串数组不适用,为了解决这个问题,增加函数的通用性,可以在上述函数中增加一个函数指针的参数,用这个函数调用一个自定义的比较函数,实例如下

void *lSearch(void *key,void *base,int total_n,int elemSize,int (*cmpfn)(void *,void *)){
	void *elemAddr;
	for(int i=0;i<total_n;i++){
		elemAddr=(char *)base+i*elemSize;
		if(!cmpfn){
			if(memcmp(elemAddr,key,elemSize)==0)
				return elemAddr;
		}else{
			if(cmpfn(elemAddr,key)==0)
				return elemAddr;
		}
	}
	return NULL;
}
//字符串数组搜索范例
int strCmp(void *vp1,void *vp2){
	char *s1=*(char**)vp1;	//不要写成s1=(char *)cp1;s1获取的值不一样
	char *s2=*(char**)vp2;
	return strcmp(s1,s2);
}

int main(){
	char *key="abc";
	char *arrc[]={"cc","bc","abc","dd"};
	char *find=lSearch(&key,arrc,4,sizeof(char *),strCmp);
}
posted @ 2016-05-17 21:26  jerehao  阅读(981)  评论(1编辑  收藏  举报