当前位置 博文首页 > 广大菜鸟的博客:C语言也可以实现泛型(转)
原文地址:https://www.cnblogs.com/wuyudong/p/c-general-function1.html
#include<string.h>
#include<stdio.h>
// C 语言也可以实现一定的泛型编程,但这样是不安全的,系统对其只有有限的检查。在编程时一定要多加细心。
/*变量是不能声明为 void 无类型的。而你不知道调用此函数传进的参数是什么类型的,无法确定一种类型的声明。
同时,不能将 * 用在无类型指针上,因为系统没有此地址指向对象大小的信息。在编译阶段,编译器无法得知传入此函数参数的类型的*/
void swap(void*v1,void*v2,int size){
char buffer[size];
memcpy(buffer,v1,size);
memcpy(v1,v2,size);
memcpy(v2,buffer,size);
}
void* search(void*key,void*base,int n,int elementSize){
for(int i=0;i<n;i++){
void*element = (char*)(base)+ i*elementSize;
if(memcmp(key,element,elementSize)==0)
return element;
}
return NULL;
}
int intCmp(void*elem1,void*elem2){
int* e1 = (int*)elem1;
int* e2 = (int*)elem2;
return *e1-*e2;
}
void * search1(void*key,void*base,int n,int elementSize,int(*cmpfn)(void*,void*)){
for(int i=0;i<n;i++){
void*element = (char*)base+ i*elementSize;
if( cmpfn(key,element)==0)
return element;
}
return NULL;
}
int main(){
// 1、交换值
int x=0,y=1;
printf("x=%d,y=%d\n",x,y);
swap(&x,&y,sizeof(int));
printf("x=%d,y=%d\n",x,y);
int a[10];
for(int i=0;i<10;i++) a[i] = i+1;
int key=8;
// 2、查找
if(search(&key,&a,10,sizeof(int))!=NULL) {
printf("Founded\n");
}else{
printf("NULL\n");
}
// 3、查找
int*found = (int*)search1(&key,&a, 10, sizeof(int),intCmp);
if(found!=NULL) {
printf("Founded\n");
}else{
printf("NULL\n");
}
}
cs