C语言泛型编程——泛型冒泡排序

    xiaoxiao2024-10-26  76

           在实际编程中,常常会需要一些方法(函数),比如排序,它们具体实现基本一致,仅仅只有参数类型不同, 那么可不可以有一种通用的函数,不管是什么类型的参数都可以通用呢?

          泛型编程:泛型即是指具有在多种数据类型上皆可操作的含义,与模板有些相似。

     利用泛型编程,我们可以写一些通用的函数,以减少代码量,实现代码的通用性,以下简单的举个栗?子

    泛型冒泡排序:

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> // bool 类型 typedef int(*PFun)(void*, void*);//PFun函数指针数据类型 /*------------------比较传入的参数大小------------------------*/ int Cmp_int(void* vp1, void* vp2) { return *(int*)vp1 - *(int*)vp2; } int Cmp_double(void* vp1, void* vp2) { #define EPS 0.0000001 double tmp = *(double*)vp1 - *(double*)vp2; if (tmp >= EPS) { return 1; } else if (tmp <= -EPS) { return -1; } else { return 0; } } int Cmp_ch(void* vp1, void* vp2) { return *(char*)vp1 - *(char*)vp2; } int Cmp_str(void* vp1, void* vp2) { return strcmp(*(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); } //arr:数组首地址;len:数组长度;elemsize:每个元素的字节数,pcmp对应类型的比较函数的指针 void BubbleSort(void* arr, int len, int elemsize, PFun pcmp) { //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 (pcmp(base, base_next) > 0) { Swap(base, base_next, elemsize); flag = 1; } } if (flag == 0) break; //没有进行交换,已有序 } } int main() { /*-----------整型数组排序测试------------*/ int arr[] = { 1,5,7,0,9,12,34,6,8,10 }; 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]); } printf("\n"); /*-----------浮点数(float、double)型数组排序测试------------*/ double drr[] = { 12.3,67.8f,23.4,15.6f }; BubbleSort(drr, sizeof(drr) / sizeof(drr[0]), sizeof(double), Cmp_double); for (int i = 0; i < sizeof(drr) / sizeof(drr[0]); i++) { printf("%g ", drr[i]);//%g自动调整小数显示位数 } printf("\n"); /*--------字符型数组排序测试---------*/ char crr[] = { 'c','e','d','a','b' }; BubbleSort(crr, sizeof(crr) / sizeof(crr[0]), sizeof(char), Cmp_ch); for (int i = 0; i < sizeof(crr) / sizeof(crr[0]); i++) { printf("%c ", crr[i]); } printf("\n"); /*--------字符串型数组排序测试---------*/ const char* srr[] = { "ert","fd","udi","bdc","Ruy" };//大写字母排在前 BubbleSort(srr, sizeof(srr) / sizeof(srr[0]), sizeof(char*), Cmp_str); for (int i = 0; i < sizeof(srr) / sizeof(srr[0]); i++) { printf("%s ", srr[i]); } printf("\n"); return 0; }

     

    最新回复(0)