64,664
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#ifndef _INT_
#define _INT_
#endif
int cmp(const void *a,const void *b){
#ifdef _INT_
return (*(int *)a-*(int *)b);
#elif _FLOAT_
return (fabs(*(float *)a-*(float *)b)<1e-6)?-1:1;
#elif _DOUBLE_
return (fabs(*(double *a)-*(double *)b)<1e-9)?-1:1;
#endif
}
#ifdef _INT_
void FindMin(int *arr,int arr_size,int *result,int cmp(const void *a,const void *b))
#elif _FLOAT_
void FindMin(float *arr,int arr_size,float *result,int cmp(const void *a,const void *b))
#elif _DOUBLE_
void FindMin(double *arr,int arr_size,double *result,int cmp(const void *a,const void *b))
#endif
{
int i;
*result=arr[0];
for(i=1;i<arr_size;++i){
if(cmp(&arr[i],result)>0)
*result=arr[i];
}
}
int main(){
int arr1[]={1,2,4,2,1,7};
int result;
FindMin(arr1,6,&result,cmp);
printf("%d\n",result);
return 0;
}
void FindMin(void *arr,int arr_size,int arrmembersize,void * result, //result保存最小值的地址.
int (*fpCmp)(const void *,const void *b)){
int i;
unsigned char *pSrc = (unsigned char *)arr;
unsigned char *pRes = (unsigned char *)result;
memcpy( (void *)pRes, (const void *)pSrc, arrmembersize );
for (i=1;i<arr_size;i++){
pSrc += arrmembersize;
if ( fpCmp((const void *)pSrc, result)<0 ){
memcpy( (void *)pRes, (const void *)pSrc, arrmembersize );
}
}
}
#include "stdio.h"
#include "stdlib.h"
int cmp(const void *a,const void *b){
return *((int *)a)-*((int *)b);
}
int FindMin(const void *arr,int arr_size,int arrmembersize,int (*cmp)(const void *,const void *)){
char *p=(char *)arr;//开始的时候,我不是很明白,所以,以为用(int *)都可以.原来,指针本身所占字节没问题,只是加减的时候,是按照对应类型所占的字节数来移动的.所以本题应该用(char *)
int index=0;
int i;
for (i=1;i<arr_size;++i){
if (cmp(p+index*arrmembersize,p+i*arrmembersize)>0){
index=i;
}
}
return index;
}
int main(){
int arr[]={2,1,1,2,3,4,5,0,2,3,1,3};
//int *result;
int result;
result=FindMin(arr,12,sizeof(arr[0]),cmp);
printf("%d,%d\n",result,arr[result]);
//system("PAUSE");
return 0;
}