函数指针(回调函数)实现多选项排序

  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

 

posted @ 2021-03-03 23:56  王廷胡_白嫖帝  阅读(103)  评论(0编辑  收藏  举报