C语言泛型编程 -----泛型冒泡

    xiaoxiao2024-11-29  70

    泛型冒泡(腾讯面试题)

    泛型,顾名思义,就是不不拘泥于数据类型,通过一些通用的函数来实现各种需求,从而减少代码量,提高程序的通用性。

    话不多说,直接上例子

    //泛型冒泡(腾讯面试题) #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #include<string.h> typedef int(*Fun)(void *vp1,void *vp2); //泛型冒泡排序 int Cmp_int(void *vp1,void *vp2) { return *(int *)vp1 - *(int *)vp2; } int Cmp_str(void *vp1,void *vp2) { return strcmp(*(char **)vp1,(*(char **)vp2)); } int Cmp_double(void *vp1,void *vp2) { #define EPS 0.000001 double tmp = *(double *)vp1 - *(double *)vp2; if(tmp > EPS) { return 1; } if(tmp = EPS) { return 0; } if(tmp < -EPS) { return -1; } } int Cmp_single_letter(void *vp1,void *vp2)//单字符排序 { return *(char*)vp1-*(char *)vp2; } void Swap(void *vp1,void *vp2,int size) { void *tmp = malloc(size); memcpy(tmp,vp1,size); memcpy(vp1,vp2,size); memcpy(vp2,tmp,size); free(tmp); } void BubbleSort(void *arr,int len ,int elemsize, Fun cmp) { void *tmp = malloc(elemsize); //bool flag; int flag;//标记是否发生了数据交换,若无交换则已经处于有序状态,无需再往下进行遍历 void *base; void *base_next; for(int i=0;i<len-1;i++) { flag = 0; for(int j=0;j<len-i-1;j++) { base = (char *)arr+j*elemsize; base_next = (char *)arr+(j+1)*elemsize; if(cmp(base,base_next) > 0) { Swap(base,base_next,elemsize); flag = 1; } } if(flag==0) break; //没有进行交换,已有序 } free(tmp); } int main() { int arr[]={6,3,2,6,4,7,3,8,3,787,3,6}; BubbleSort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),Cmp_int); for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { printf("%d ",arr[i]); } puts(" "); char *brr[]={"ert","fd","udi","fdc","ruy"}; BubbleSort(brr,sizeof(brr)/sizeof(brr[0]),sizeof(char *),Cmp_str); for(int i=0; i<sizeof(brr)/sizeof(brr[0]); i++) { printf("%s ",brr[i]); } puts(" "); double crr[]={1.2,5.6,7.8,355.7,3.8,56.9}; BubbleSort(crr,sizeof(crr)/sizeof(crr[0]),sizeof(double),Cmp_double); for(int i=0; i<sizeof(crr)/sizeof(crr[0]); i++) { printf("%g ",crr[i]); } puts(" "); //bug char drr[]={'c','e','d','a','b'}; BubbleSort(drr,sizeof(drr)/sizeof(drr[0]),sizeof(char),Cmp_single_letter); for(int i=0; i<sizeof(drr)/sizeof(drr[0]); i++) { printf("%c ",drr[i]); } puts(" "); return 0; }

    程序运行结果如下:

    希望对您有所帮助 不足之处还请多多指教!

    最新回复(0)