用回调函数来完成多种数据类型的插入排序
来源:互联网 发布:软件设计师真题 编辑:程序博客网 时间:2024/06/05 02:35
做了《Linux C一站式编程》中的一道习题,通过回调函数实现了对多种数据类型的插入排序。
如下例,在实现选择排序函数insertion_sort( )的时候,通过指向比较函数的指针cmp来比较大小。待比较的数据的数据类型在insertion_sort( )实现的时候是不知道的,在insertion_sort( )在main.cpp中被调用的时候才知道,所以cmp具体指向的比较函数(如cmp_int, cmp_float, cmp_char)在insertion_sort( )被调用的地方(main.cpp)才得到具体实现。
下面是头文件
/* generic_sort.h *//** 目标: 实现回调函数版本的插入排序* 1 对data[]的处理方法。data是一个数组,每个元素是void*类型,所以data数组名字是指向void*的指针,是一个指向指针的指针。**/#ifndef GENERIC_SORT_H#define GENERIC_SORT_typedef int (*cmp_t)(void *, void *);extern void *insertion_sort(void *data[], int num, cmp_t cmp);#endif
下面是实现文件
/*generics_sort.cpp *///目标: 实现回调函数版本的插入排序#include "generic_sort.h"void * insertion_sort(void *data[], int num, cmp_t cmp) //注意第1个参数是一个指向指针的指针,data[]表示说明是数组类型,所以是指针。数组中的元素是void*型,所以是指向指针的指针。{ for ( int j = 1; j < num; j++) { int m = j-1; void* key = data[j]; while( m>=0 &&(cmp(key,data[m])==-1) ) { data[m+1] = data[m]; m--; } data[m+1]=key; }return data[0];}下面是main.cpp文件
/* main.cpp *///目标:实现回调函数版本的插入排序#include <iostream>#include <stdio.h>#include "generic_sort.h"void print_num_int_p(int** arr, int len){ for(int i=0;i<len;i++) std::cout<<*arr[i]<<"\t"; std::cout<<std::endl; return;}void print_num_double_p(double** arr, int len){ for(int i=0;i<len;i++) std::cout<<*arr[i]<<"\t"; std::cout<<std::endl; return;}void print_num_char_p(char** arr, int len){ for(int i=0;i<len;i++) std::cout<<*arr[i]<<"\t"; std::cout<<std::endl; return;}int cmp_int(void *a, void *b){ if( (*(int *)a) > (*(int *)b) ) return 1; else if( (*(int *)a) == (*(int *)b) ) return 0; else return -1;}int cmp_double(void *a, void *b){ if( (*(double *)a) > (*(double *)b) ) return 1; else if( (*(double *)a) == (*(double *)b) ) return 0; else return -1;}int cmp_char(void *a, void *b){ if( (*(char*)a) > (*(char *)b) ) return 1; else if( (*(char*)a) == (*(char *)b) ) return 0; else return -1;}int main(void){ int list_a[4] = {3,7,5,1}; double list_b[4] = {0.3,7.2,5.6,1.9}; char list_c[4] = {'b','c','B','e',}; int *plist_a[4] = {&list_a[0], &list_a[1], &list_a[2], &list_a[3]}; double *plist_b[4] = {&list_b[0], &list_b[1], &list_b[2], &list_b[3]}; char *plist_c[4] = {&list_c[0], &list_c[1], &list_c[2], &list_c[3]}; print_num_int_p(plist_a,4);insertion_sort((void**)plist_a,4,cmp_int); print_num_int_p(plist_a,4);print_num_double_p(plist_b,4);insertion_sort((void**)plist_b,4,cmp_double); print_num_double_p(plist_b,4);print_num_char_p(plist_c,4);insertion_sort((void**)plist_c,4,cmp_char); print_num_char_p(plist_c,4);int a = getchar(); return 0;}
下面是输出结果
简单地讲,回调函数就是具有类似下面这样的功能的函数。
在function_a实现的时候, 通过函数指针指向了了函数function_b,
对于function_a而言,它并不知道function_b内部具体是怎样实现的,它只知道function_b的输入输出。它会给function_b传入数据,并且根据function_b的输出结果进一步做事情。
对于function_a的调用者而言(如在main.cpp中调用的时候),调用者需要体用具体的function_b的实现。
这样的情况下,function_b就被称作为回调函数。称作为"回调"是因为,在function_a的实现中,只是通过一个指针调用了function_b,function_a并不知道function_b的内部实现。function_b的真正实现是在function_a被调用的地方具体指明的(如在main.cpp中),绕了一个圈子,所以有回调(call back)的意思。
书中还有更多更清楚的讲解和例子。
- 用回调函数来完成多种数据类型的插入排序
- 回调函数实现冒泡法的多种排序
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 【C语言】使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- uploadify中完成回调函数不执行的解决方法
- vue加载完成后的回调函数
- 用回调函数实现冒泡排序
- 用回调函数实现冒泡排序
- [ 回调函数 ] 看不过去了,咱来一个简明的回调函数的示例
- 数的插入排序
- $.post(路径,参数,回调函数,数据类型);
- php-Arrays 函数-array_diff_uassoc-用回调函数做索引检查来计算数组的差值
- php-Arrays 函数-array_intersect_ukey-用回调函数比较键名来计算数组的交集
- 用淘宝购物的经验来理解Java回调函数
- 使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现
- 不用回调函数来捕捉数据包
- Cocos2d-x初始化对象和销毁对象函数执行顺序
- 打开网页 (版本1)
- 原型模式
- 写SQL要学会使用"执行计划"
- The 1st tip of DB Query Analyzer
- 用回调函数来完成多种数据类型的插入排序
- 测试用例的要素
- AppStore新应用上传指南
- solr学习之四--------Field、CopyField、DynamicField
- my_simple_RAII
- xquery
- Listagg() - Oracle11gR2进行字符串汇总的新函数
- 浅谈软件架构师的素质与职责
- android 十字架效果实现(水平和垂直滑动)