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+ ...
随机推荐
- C#的泛型和Java的伪泛型
C#的泛型和java的伪泛型,talk is cheap,show me the code C#泛型 下面结果,C#里面会输出false,如果这个还不能真正的说明C#的泛型是真的泛型,那就看下面这 ...
- docker安装以及常用命令
yum-config-manager 对/etc/yum.repos.d/下的.repo文件进行增删改查 yum install -y yum-utils 添加docker源,由于yum源的docke ...
- 自己写了个Java RMI(远程方法调用)的实现案例
自己简单写了个Java RMI(远程方法调用)的实现案例. 为了更好理解RMI(远程方法调用).序列化的意义等等,花费三天多的时间肝了一个Java RMI的实现案例. !!!高能预警!!! 代码量有点 ...
- C#中?和:?和??代表什么
?代表可空类型修饰符 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.为了使值类型也可为空,就可以使用可空类型?:带便三元表达式 int a=b>c?b:c 如果 ...
- LeetCode-082-删除排序链表中的重复元素 II
删除排序链表中的重复元素 II 题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序 ...
- SQL基础语法_周志城
一:建库建表语法,字段数据类型 1:建库建表语法 create (创建,关键字) database (数据库,关键字) IF NOT EXISTS 作用:如果需要创建的库已存在,将不会创建 DEF ...
- Linux 查询文件内容重复数 uniq、sort命令
前提:uniq只能查询数据相邻的重复次数,而sort可以查询乱序的重复次数. 原谅我,以下内容都是复制菜鸟驿站的!!! Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sor ...
- 常见的url编码
URL编码值 字符 %20 空格 %22 " %23 # %25 % %26 &; %28 ( %29 ) %2B + %2C , %2F / %3A : %3B ; %3C < ...
- Android 12(S) 图形显示系统 - 简单聊聊 SurfaceView 与 BufferQueue的关联(十三)
必读: Android 12(S) 图形显示系统 - 开篇 一.前言 前面的文章中,讲解的内容基本都是从我们提供的一个 native demo Android 12(S) 图形显示系统 - 示例应用( ...
- 西门子STEP7安装过程不断提示电脑重启的解决方法
win+R打开注册表 进入 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 删除PendingFileR ...