zoukankan      html  css  js  c++  java
  • 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("
    ");
    
    	/*-----------浮点数(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("
    ");
    
    	/*--------字符型数组排序测试---------*/
    	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("
    ");
    
    	/*--------字符串型数组排序测试---------*/
    	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("
    ");
    
    	return 0;
    }
    
  • 相关阅读:
    快速切题 sgu102.Coprimes 欧拉函数 模板程度 难度:0
    快速切题 sgu104. Little shop of flowers DP 难度:0
    poj 1163 The Triangle 搜索 难度:0
    sgu101 欧拉路径 难度:1
    快速切题 poj3414 Pots
    xml学习
    linux
    常用排序算法
    C++面试题目
    软件工程的一些问题
  • 原文地址:https://www.cnblogs.com/TaoR320/p/12680207.html
Copyright © 2011-2022 走看看