C语言泛型编程——泛型冒泡排序
在实际编程中,常常会需要一些方法(函数),比如排序,它们具体实现基本一致,仅仅只有参数类型不同, 那么可不可以有一种通用的函数,不管是什么类型的参数都可以通用呢?
泛型编程:泛型即是指具有在多种数据类型上皆可操作的含义,与模板有些相似。
利用泛型编程,我们可以写一些通用的函数,以减少代码量,实现代码的通用性,以下简单的举个栗?子
泛型冒泡排序:
#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语言泛型编程——泛型冒泡排序的更多相关文章
- C语言之通过冒泡排序浅谈编程思想
写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时 ...
- C语言泛型编程--抽象数据类型
一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...
- C语言学习笔记 -冒泡排序
//冒泡排序 void main(){ , , , , }; ]); ; i<max - ; i++) { for (int j = i; j<max; j++) { if (a[i]&g ...
- C语言数组之冒泡排序+折半查找法(二分查找)
冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...
- go语言基础之冒泡排序原理
1.冒泡排序原理 示例: package main //必须有个main包 import "fmt" import "math/rand" import &qu ...
- C++应该被看成是个语言集合——四种语言(C语言,OO语言,泛型语言,STL)
至少有三种语言: 一,C++ is C 二,C++ is an OO language 三,C++ is a genetic programming language 有的童鞋觉得难,可能是没有看清楚 ...
- C语言8.3冒泡排序
8.3.1 例8-5 题目:输入n个正整数,将他们从小到大排序后输出,要求使用冒泡排序法. 而在自己抄写代码的时候,出现了以下问题: # include<stdio.h> void bub ...
- c语言实行泛型hashmap
代码出处:A simple string hashmap in C https://github.com/petewarden/c_hashmap main.c (main2是官方源代码,main是 ...
- 嵌入式-c语言基础:冒泡排序实现从大到小排列
#include<stdio.h> int main() { /*冒泡排序:从大到小*/ /*i=0 第1轮(i+1):需要比较9次(sizeArr-i-1)*/ /*i=1 第2轮(i+ ...
随机推荐
- oj教程--坑
1.OJ判断是只看输出结果的. 2.纯字符串用puts()输出. 3.有很多数学题是有规律的,直接推公式或用递归.循环. 4.擅用三目运算符 5.将乘法转换成加法减少时间 6.空间换时间 7.数组越界
- 深入Mybatis框架
深入Mybatis框架 学习了Spring之后,我们已经了解如何将一个类作为Bean交由IoC容器管理,也就是说,现在我们可以通过更方便的方式来使用Mybatis框架,我们可以直接把SqlSessio ...
- AndroidMainifest.xml文件属性
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package=" ...
- Mac下的平铺式桌面 - Yabai
Mac下的平铺式桌面 - Yabai 近来无事,凑着周末休息的时间,想折腾一下 Mac.很久之前就有朋友给我推荐过一款名为"Yabai"的平铺式桌面管理软件,今天,就折腾起来了. ...
- 在vue项目中MD5加密的使用方法
1:安装 npm install --save js-md5 2.引入及使用 方法一:在需要的项目文件中引入 import md5 from 'js-md5'; 使用例子:md5('hello wor ...
- Linux常用文件权限命令详解
pwd pwd命令用于获取当前工作目录的绝对路径. 使用示例: pwd 效果如下图: cd cd命令用于切换工作目录. 使用示例: cd 万猫学社/ 效果如下图: 其中在路径表示时, 一个半角句号(. ...
- Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析
Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...
- Angular依赖注入:全面讲解(翻译中)
在实际使用Angular依赖注入系统时,你需要知道的一切都在本文中.我们将以实用易懂并附带示例的形式解释它的所有高级概念. Angular最强大.最独特的功能之一就是它内置的依赖注入系统. 大多数时候 ...
- egg项目eslint不识别链式操作符的解决方法
项目用到链式?.结果eslint一直提示 const permissionHandleArr = positionPermissionHandle.map(item => item.permis ...
- 手写 Vue2 系列 之 patch —— diff
前言 上一篇文章 手写 Vue2 系列 之 初始渲染 中完成了原始标签.自定义组件.插槽的的初始渲染,当然其中也涉及到 v-bind.v-model.v-on 指令的原理.完成首次渲染之后,接下来就该 ...