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

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

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

泛型冒泡排序:

#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;
}

C语言泛型编程——泛型冒泡排序的更多相关文章

  1. C语言之通过冒泡排序浅谈编程思想

    写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时 ...

  2. C语言泛型编程--抽象数据类型

    一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...

  3. C语言学习笔记 -冒泡排序

    //冒泡排序 void main(){ , , , , }; ]); ; i<max - ; i++) { for (int j = i; j<max; j++) { if (a[i]&g ...

  4. C语言数组之冒泡排序+折半查找法(二分查找)

    冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...

  5. go语言基础之冒泡排序原理

    1.冒泡排序原理 示例: package main //必须有个main包 import "fmt" import "math/rand" import &qu ...

  6. C++应该被看成是个语言集合——四种语言(C语言,OO语言,泛型语言,STL)

    至少有三种语言: 一,C++ is C 二,C++ is an OO language 三,C++ is a genetic programming language 有的童鞋觉得难,可能是没有看清楚 ...

  7. C语言8.3冒泡排序

    8.3.1 例8-5 题目:输入n个正整数,将他们从小到大排序后输出,要求使用冒泡排序法. 而在自己抄写代码的时候,出现了以下问题: # include<stdio.h> void bub ...

  8. c语言实行泛型hashmap

    代码出处:A simple string hashmap in C  https://github.com/petewarden/c_hashmap main.c (main2是官方源代码,main是 ...

  9. 嵌入式-c语言基础:冒泡排序实现从大到小排列

    #include<stdio.h> int main() { /*冒泡排序:从大到小*/ /*i=0 第1轮(i+1):需要比较9次(sizeArr-i-1)*/ /*i=1 第2轮(i+ ...

随机推荐

  1. Linux下忘记MySQL密码的解决办法

    一.使用免密码登录 1.使用 #find / -name my.cfg 找到mysql配置文件 2.vim /etc/mysql/my.cfg (我的配置文件是这个路径,每个人的路径可能有所不同,用f ...

  2. oj教程--坑

    1.OJ判断是只看输出结果的. 2.纯字符串用puts()输出. 3.有很多数学题是有规律的,直接推公式或用递归.循环. 4.擅用三目运算符 5.将乘法转换成加法减少时间 6.空间换时间 7.数组越界

  3. spring项目获取ApplicationContext(能手动从Spring获取所需要的bean)

    最流行的方法就是  实现ApplicationContextAware接口 @Component public class SpringContextUtil implements Applicati ...

  4. go 中 sort 如何排序,源码解读

    sort 包源码解读 前言 如何使用 基本数据类型切片的排序 自定义 Less 排序比较器 自定义数据结构的排序 分析下源码 不稳定排序 稳定排序 查找 Interface 总结 参考 sort 包源 ...

  5. 怎样打开win7的IIS功能及internet信息服务(IIS)管理器在哪里

    1:在windows7桌面上的左下角,点击"开始",找到"控制面板",并点击进去.如下图所示: 2:进入控制面板后,首先将"查看方式"选择为 ...

  6. 【AI】AI学习方向

    df

  7. 【架构】从instagram学习最小化IT是怎么做的

    Keep it very simple (极简主义) Don't re-invent the wheel (不重复发明轮子) Go with proven and solid technologies ...

  8. ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用

    与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的 ...

  9. Failed to execute "C:\learn\C\程序练习\1.exe": Error 0: 操作成功完成。 请按任意键继续. . .问题解决

    在DEV中编译运行时出现以上提示,原因是该文件被杀毒软件隔离了,认为它是病毒文件 解决办法,找到该文件进行恢复

  10. 嵌入式linux驱动开发 笔记

    @ 目录 首个驱动hellodrv 1.编写源码 2.编译模块 3.加载驱动 首个驱动hellodrv 3.如果下载不到,就自己编写,并编译驱动. 1.编写源码 2.编译模块 1.先写makefile ...