编写一个名叫sort的函数,它用于对一个任意类型的数组进行排序。为了使函数更为通用,它的
   其中一个参数必须是一个指向比较回调函数的指针,该回调函数由调用程序提供。比较函数接受
   两个参数,也就是两个指向需要比较的值的指针。如果两个值相等,函数返回0;如果第1个值小
   于第2个,函数返回一个小于0的整数;如果第1个值大于第2个值,函数返回一个大于0的整数。
   sort函数的主要参数有:
   1. 一个指向需要排序的数组的第1个值的指针。
   2. 数组中元素的个数。
   3. 一个指向比较回调函数的指针。

对此,在排序函数中,由于使用的是数组地址,为此在这还使用了一个交换函数,用于对各种类型的数组元素来进行交换。对此,以下的代码只是简单的实现了对int、char类型的排序:

#include<stdio.h>
#include<string.h>
typedef void Swap(void* x,void* y);
void swapInt(void* x,void* y)
{int* p1=(int*)x;int* p2=(int*)y;int temp=*p1;*p1=*p2;*p2=temp;
}
void swapChar(void* x,void* y)
{char* p1=(char*)x;char* p2=(char*)y;char temp=*p1;*p1=*p2;*p2=temp;
}typedef void (*Print)(void* data,int n);
void printInt(void* data,int n)
{int *p = (int *)data;for(int i=0;i<n;++i){printf("%d  ",*(p+i));}}
void printChar(void* data,int n)
{char *p = (char *)data;for(int i=0;i<n;++i){printf("%c  ",*(p+i));}
}
typedef int (*Compare)(void* x,void* y);
int compareInt(void* x,void* y)
{if(x!=NULL&&y!=NULL){int* p1=(int*)x;int* p2=(int*)y;if(*p1>*p2)return 1;if(*p1==*p2)return 0;if(*p1<*p2)return -1;}elseprintf("比较参数不足,无法比较!"); }
int compareChar(void* x,void* y)
{if(x!=NULL&&y!=NULL){char* p1=(char*)x;char* p2=(char*)y;if(*p1>*p2)return 1;if(*p1==*p2)return 0;if(*p1<*p2)return -1;}elseprintf("比较参数不足,无法比较!"); }/*
void *arr :待打印的数组
int arrSize: sizeof(数组元素的类型 )
int n:数组元素的个数
Compare compare: 该函数实现不同类型数据的比较
*/
int Sort(void *arr,int arrSize,int n,Compare compare,Swap swap)
{char* test=(char*)arr;for(int i=0;i<n-1;++i){for(int j=0;j<n-1-i;++j){if(1==compare(test+j*arrSize,test+(j+1)*arrSize)){swap(test+j*arrSize,test+(j+1)*arrSize);}}}
}int main()
{int arrInt[]={2,3,1,6,5};int len=sizeof(arrInt)/sizeof(arrInt[0]);char arrChar[]={'f','b','v','y','p'};int len2=sizeof(arrChar)/sizeof(arrChar[0]);Sort(arrInt,sizeof(int),len,compareInt,swapInt);Sort(arrChar,sizeof(char),len2,compareChar,swapChar);printInt(arrInt,len);printf("\n");printChar(arrChar,len2);return 0;
}

使用函数指针来编写一个名叫sort的函数,它用于对一个任意类型的数组进行排序。相关推荐

  1. 函数指针定积分C语言,急!!!利用函数指针变量编写一个求定积分的通用函数,...

    急!!!利用函数指针变量编写一个求定积分的通用函数, 答案:4  信息版本:手机版 解决时间 2021-05-05 09:17 已解决 2021-05-05 02:15 用它分别求5个函数的定积分:每 ...

  2. c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

    ↑↑↑ 点击上方公众号名称关注,不放过任何转变的机会. ✎ 编 者 悟 语 借口再小也会瓦解人的意志. 文 章 导 读 今天带大家用下函数指针,然后将函数指针和函数参数封装到结构体中,接着将数据用动态 ...

  3. 使用 typedef 定义函数指针,更优雅的使用函数指针

    简介 关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客: https://blog.csdn.net/afei__/article/details/80549202 使用 typ ...

  4. 《C和指针》—— 第13章 函数指针的作用1:回调函数2(与模板结合,简化代码)

    注意:此为原创文章,未经同意,请勿随意转载. 目录 1. 问题与思路 2. 具体实现 3. 结果截图 1. 问题与思路 Q:实现一个与类型无关的比较函数,且考虑模板,精简代码 A:声明一个函数指针,函 ...

  5. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数...

     1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...

  6. fib函数用python编写_Python中利用函数装饰器实现备忘功能

    "备忘"的定义 "memoization"(备忘)这个词是由Donald Michie在1968年提出的,它基于拉丁语单词"memorandum&qu ...

  7. c语言函数指针 的定义方法,C语言 函数指针一(函数指针的定义)

    //函数指针 #include #include #include //函数指针类型跟数组类型非常相似 //函数名就是函数的地址,函数的指针,对函数名进行&取地址操作,还是函数名本身,这是C语 ...

  8. java程序从键盘输入十个整数存入数组a中_并编程实现:_2.用指针方式编写程序:从键盘输入10个整数,并存入数组,要求将10个书中的最大数与第一个输入的数交...

    用指针方式编写程序,从键盘输入10个整形整数,并存入数组,要求将10个数中最大的数与第1个输入的数交换:将10个数中最小 #includevoidmain(){inta[10],i,*m,*n,k=0 ...

  9. C++:函数指针进阶(四):函数对象operator()

    C++中的  operator() 有两大主要作用: 1:Overloading --------重载() 操作符 2: Casting------实现对象类型转化 1:Overloading重载() ...

最新文章

  1. Chromosome-scale assemblies of plant genomes using nanopore long reads and optical maps
  2. iOS UITableView长按cell复制内容
  3. 全国信息化计算机应用技术水平教育考试,全国信息化计算机应用技术水平教育考试试卷.doc...
  4. 【重要更新】MyEclipse 2017 Stable 1.0发布|附下载
  5. sparkmllib scala NaiveBayes Demo
  6. 额外篇 | ggplot (上)
  7. netflix 数据科学家_数据科学和机器学习在Netflix中的应用
  8. linux 机器格式化_为什么机器人应该为我们格式化代码
  9. 实现拷贝函数(strcpy)
  10. MySQL课设小问题_MySQL必会的50个常见面试练习题
  11. HTML→标签、div语义化、表单、input标签
  12. 根据城市的三字代码查询经纬度_中国国内机场三字码及经纬度
  13. 制作传播超级手机病毒嫌犯被抓
  14. unison + inotify 实现文件实时双向同步部署步骤
  15. 鸿蒙系统2.0崩溃了,集体失声?鸿蒙系统官宣后,鸿蒙系统的真实现状显现
  16. 使用cpolar配置内网访问(内网穿透)教程(超详细,简单)
  17. 7 线性布局——LinearLayout
  18. 大文件上传 NeatUpload 控件
  19. 设计模式之禅(读后感悟随笔)-单一职责原则
  20. RC复位电路上二极管的作用

热门文章

  1. Linux 删除文件实现回收站功能
  2. 微信小程序组件化的解决方案
  3. 艾永亮:为什么良品铺子能在同质化的零食市场中突出重围?
  4. 基于VHDL的密码锁
  5. Sketch 资源合集
  6. linux 定制自己的开机logo
  7. 除了编码,还要会说话(1)
  8. 【19周-星耀】FASTER!FASTER!FASTER!
  9. Python基础—简介、变量、运算符
  10. 谈谈String.intern方法