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

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

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

泛型冒泡排序:

#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. C#的泛型和Java的伪泛型

    C#的泛型和java的伪泛型,talk is cheap,show me the code   C#泛型 下面结果,C#里面会输出false,如果这个还不能真正的说明C#的泛型是真的泛型,那就看下面这 ...

  2. docker安装以及常用命令

    yum-config-manager 对/etc/yum.repos.d/下的.repo文件进行增删改查 yum install -y yum-utils 添加docker源,由于yum源的docke ...

  3. 自己写了个Java RMI(远程方法调用)的实现案例

    自己简单写了个Java RMI(远程方法调用)的实现案例. 为了更好理解RMI(远程方法调用).序列化的意义等等,花费三天多的时间肝了一个Java RMI的实现案例. !!!高能预警!!! 代码量有点 ...

  4. C#中?和:?和??代表什么

    ?代表可空类型修饰符    引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:带便三元表达式    int a=b>c?b:c 如果 ...

  5. LeetCode-082-删除排序链表中的重复元素 II

    删除排序链表中的重复元素 II 题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序 ...

  6. SQL基础语法_周志城

    一:建库建表语法,字段数据类型 1:建库建表语法 create  (创建,关键字) database (数据库,关键字) IF NOT EXISTS  作用:如果需要创建的库已存在,将不会创建 DEF ...

  7. Linux 查询文件内容重复数 uniq、sort命令

    前提:uniq只能查询数据相邻的重复次数,而sort可以查询乱序的重复次数. 原谅我,以下内容都是复制菜鸟驿站的!!! Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sor ...

  8. 常见的url编码

    URL编码值 字符 %20 空格 %22 " %23 # %25 % %26 &; %28 ( %29 ) %2B + %2C , %2F / %3A : %3B ; %3C < ...

  9. Android 12(S) 图形显示系统 - 简单聊聊 SurfaceView 与 BufferQueue的关联(十三)

    必读: Android 12(S) 图形显示系统 - 开篇 一.前言 前面的文章中,讲解的内容基本都是从我们提供的一个 native demo Android 12(S) 图形显示系统 - 示例应用( ...

  10. 西门子STEP7安装过程不断提示电脑重启的解决方法

    win+R打开注册表 进入 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 删除PendingFileR ...