导航

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

Posted on 2011-12-23 21:55  网名还没想好  阅读(449)  评论(0编辑  收藏  举报

   回调函数的另一个典型的作用是实现类似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)