• 利用回调函数实现泛型算法


       回调函数的另一个典型的作用是实现类似C++的泛型算法。如qsort的实现等等。

       下面是我利用回调函数的特性来写的一个泛型函数,该函数的功能是在任意一组对象中求出其最大值,该对象可以是char型,也可以是int型......不多说了,直接看程序吧:

    #include <stdio.h>

    typedef int (*cmp_t) (void*, void*);

    /* 回调函数1: 对比的是char类型对象 */

    int cmp_char_data(void* a, void* b)

    {

       char para1 = *((char*)a);

       char para2 = *((char*)b);

      

       if(para1 > para2)

          return 1;

       else if(para1 == para2)

          return 0;

       else

          return -1;

    }

    /* 回调函数2: 对比的是int类型对象 */

    int cmp_int_data(void* a, void* b)

    {

       int para1 = *((int*)a);

       int para2 = *((int*)b);

      

       if(para1 > para2)

          return 1;

       else if(para1 == para2)

          return 0;

       else

          return -1;

    }

    /* 回调函数3: 对比的是double类型对象 */

    int cmp_double_data(void* a, void* b)

    {

       double para1 = *((double*)a);

       double para2 = *((double*)b);

      

       if(para1 > para2)

          return 1;

       else

          return -1;

    }

    /* 回调函数4: 对比的是struct类型对象 */

    typedef struct student

    {

       char* name;

       int score;

    }student_t;

    int cmp_struct_data(void* a, void* b)

    {

       student_t* para1 = (student_t*)a;

       student_t* para2 = (student_t*)b;

      

       if(para1->score > para2->score)

          return 1;

       else if(para1->score == para2->score)

          return 0;

       else

          return -1;

    }

    /* 实现函数max */

    void* max(void* data, int num, int size, cmp_t cmp)

    {

       void *temp = data;

       int i;

      

       for(i = 1; i < num; i++)

       {

          if(cmp(temp, data + size*i) < 0)

          {

            temp = data+size*i;

          }

       }

       return temp;

    }

    /* 主函数 */

    int main()

    {

       char c_data[5] = {'a', 'n', 'k', 'p', 'c'};

       int i_data[5]={1, 20, 50, 300,12};

       double d_data[5] = {20.2, 130.5, 100.12, 200.23, 45.6};

       student_t st_data[5] = {{"stu1", 56}, {"stu1", 85}, {"stu1", 65}, {"stu1", 96}, {"stu1", 72}};

      

       char max1 = *((char*)max(c_data, 5, sizeof(char), cmp_char_data));

       int max2 = *((int*)max(i_data, 5, sizeof(int), cmp_int_data));

       double max3 = *((double*)max(d_data, 5, sizeof(double), cmp_double_data));

       student_t* max4 = (student_t*)max(st_data, 5, sizeof(student_t), cmp_struct_data);

      

       printf("%c\t%d\t%lf\t%d\n", max1, max2, max3, max4->score);

      

       getchar();

       return 0;

    }

    转自(http://hi.baidu.com/s_rlzheng/blog/item/ee99512a6cf145315243c1e4.html#0)

  • 相关阅读:
    「SDOI2018」物理实验
    「SDOI 2018」战略游戏
    「CodeChef Dec13 REALSET」 Petya and Sequence 循环卷积
    关于微信卡券投放code接口报错原因
    composer update maatwebsite/excel 之后 在linux机子上出现500解决方案
    开启mysql 服务【window】
    thinkphp在linux上部署环境(500情况)
    如何推广微信小程序到企业微信
    linux 阿里云远程连接mysql
    php7以上 不支持mcrypt_module_open方法问题【微信开放平台】
  • 原文地址:https://www.cnblogs.com/ymy124/p/2299991.html
Copyright © 2020-2023  润新知