C语言函数指针:获得任意类型数组的最大

 1 #include <stdio.h>
 2  
 3 //{3,5,8,7,6}
 4 /*
 5 int max(int *nums,int len)
 6 {
 7     int i;
 8     int max=nums[0];//假定第0个元素为最大值
 9     for(i=1;i<len;i++)
10     {
11         int value = *nums;
12         if(value>max)
13         {
14             max = value;//如果找到比max还大的,则max让位
15         }
16         nums++;
17     }
18     return max;
19 }
20 */
21  
22 typedef struct _Dog
23 {
24     char* name;
25     int age;
26 } Dog;
27 typedef int (*compareFunc)(void * data1,void * data2);
28 //data 待比较数据数组的首地址,uniteSize单元字节个数
29 //size:数据的长度。{1,3,5,6}:size=4
30 //比较data1和data2指向的数据做比较,
31 //如果data1>data2,则返回正数
32 void* max(void* data,int unitSize,int size,
33     compareFunc func)
34 {
35     int i;
36     char *ptr = (char *)data;
37     char *max = ptr;//假定最开始的元素为最大值
38     for(i=1;i<size;i++)
39     {      
40         char* item = ptr+i*unitSize;//计算第i个元素的首地址   
41         if(func(item,max)>0)//如果item大于max
42         //到底取几个字节进行比较是func内部的事情
43         {
44             max = item;
45         }
46     }
47     return max;//最大值的首地址
48 }
49  
50 //data1是第一个被比较数字的首地址
51 int intCompare(void* data1,void *data2)
52 {
53     int* ptr1 = (int*)data1;
54     int* ptr2 = (int*)data2;
55     int i1=*ptr1;
56     int i2=*ptr2;
57     return i1-i2;
58 }
59  
60 int dogCompare(void* data1,void* data2)
61 {
62     Dog* dog1 = (Dog*)data1;
63     Dog* dog2 = (Dog*)data2;
64     return (dog1->age)-(dog2->age);
65     //return (dog2->age)-(dog1->age);
66 }
67  
68 int main(int argc, char *argv[])
69 {
70     /*
71     int nums[] = {3,5,8,7,6};
72     int *pMax = (int *)max(nums,sizeof(int),sizeof(nums)/sizeof(int),
73         intCompare);
74     int max = *pMax;
75     printf("%d\n",max);
76     */
77     /*Dog dogs[] ={{"沙皮",3},{"腊肠",10},{"哈士奇",5},{"京巴",8},{"大狗",2}};*/
78     /*Dog *pDog = (Dog *)max(dogs,sizeof(Dog),
79         sizeof(dogs)/sizeof(Dog),dogCompare);
80     printf("%s=%d",pDog->name,pDog->age);*/
81     /*qsort(dogs,sizeof(dogs)/sizeof(Dog),sizeof(Dog),dogCompare);
82     int i;
83     for(i=0;i<sizeof(dogs)/sizeof(Dog);i++)
84     {
85         Dog dog = dogs[i];
86         printf("%s=%d|",dog.name,dog.age);
87     }*/
88     int nums[] = {3,5,8,7,6};
89     qsort(nums,sizeof(nums)/sizeof(int),sizeof(int),
90         intCompare);
91     int i;
92     for(i=0;i<sizeof(nums)/sizeof(int);i++)
93     {
94         int n = nums[i];
95         printf("%d|",n);
96     }
97  
98     return 0;
99 }

 

posted @ 2015-05-22 11:31  紫系流月  阅读(523)  评论(0编辑  收藏  举报