函数指针(回调函数)实现多选项排序
main.c
1 #include <stdio.h> 2 #include "other.h" 3 int main() 4 { 5 int addr[10] = {12,353,24512,0,23,51,245,2,5623,24}; 6 int len = sizeof(addr)/sizeof(int); 7 Print_addr(addr,len); 8 9 //排序函数的额调用 10 sort(addr,len,my_cmp); 11 12 Print_addr(addr,len); 13 14 sort(addr,len,my_cmp_2); 15 16 Print_addr(addr,len); 17 18 return 0; 19 }
other.c
1 #include <stdio.h> 2 #include "other.h" 3 //打印函数 4 void Print_addr(const int *p,int len) 5 { 6 for(int i = 0 ; i < len ;i++) 7 { 8 printf("%d,",*p++); 9 } 10 printf("\n"); 11 } 12 13 int my_cmp(const void* data_1,const void* data_2) 14 { 15 //已经知道他们是int类型了 16 const int *num_1 = data_1; 17 const int *num_2 = data_2; 18 19 return *num_1 - *num_2; 20 //前面一个 - 后面一个 21 } 22 23 int my_cmp_2(const void* data_1,const void* data_2) 24 { 25 //已经知道他们是int类型了 26 const int *num_1 = data_1; 27 const int *num_2 = data_2; 28 29 return *num_2 - *num_1; 30 //前面一个 - 后面一个 31 } 32 33 //排序函数的实现 34 void sort(int *p,int len,int (*cmp)(const void*,const void*)) //cmp是指针变量, 35 { 36 //int (*cmp)(const void*,const void*)定义函数指针 37 //sort(addr,10,my_cmp); cmp = my_cmp; cmp() 代替了 my_cmp 38 int temp = 0; 39 for(int i = 0; i < len ;i++) 40 { 41 for(int j = 0; j < len - 1;j++) 42 { 43 if(cmp(&p[j] , &p[j+1]) > 0) 44 { 45 temp = p[j]; 46 p[j] = p[j+1]; 47 p[j+1] = temp; 48 } 49 50 } 51 } 52 }
other.h
1 #ifndef OHTER_H 2 #define OTHER_H 3 //typedef 使得 cmp_func 去代替了int (*cmp_func)(const void*,const void*)类型 4 typedef int (*cmp_func)(const void*,const void*); 5 6 // 7 int my_cmp(const void* data_1,const void* data_2); 8 int my_cmp_2(const void* data_1,const void* data_2); 9 10 //打印函数 11 void Print_addr(const int *p,int len); 12 13 //cmp_func 他是类型,他是 int (*cmp_func)(const void*,const void*)的类型 14 // 类型 变量名; //定义一个函数指针 返回值为int类型,参数为两个cosnt void*的类型的函数指针 15 //cmp_func cmp; cmp = my_cmp; ---> cmp() == my_cmp() 16 void sort(int *p,int len,int (*cmp)(const void*,const void*)); 17 18 #endif