C语言回调函数

 

目录

                                              回调函数

标准库中qsort函数声明:

int 数组排序:

用函数指针实现qsort


                                            回调函数

标准库中<stdlib.h>qsort函数声明:

     void    _Cdecl qsort  (void *base, size_t nelem, size_t width, int _Cdecl (*fcmp)(/* const void *, const void * */));

int 数组排序:

/*快速排序*/
void qsort(int v[], int left, int right)
{
	int i, last;
	void swap(int v[], int i, int j);

        if(left >= right)
		return;
	swap(v, left, (left + right)/2);
 	last = left;
	for(i = left + 1; i <= right; i++)
	{	
		if(v[i] < v[left])
		{	
			swap(v, ++last, i);
		}
        }
	swap(v, left, last);
	qsort(v, left, last - 1);
   	qsort(v, last + 1, right);       
}

/*交换v[i], v[j]的值*/
void swap(int v[], int i, int j)
{
 	int temp;
        temp = v[i];
        v[i] = v[j];
	v[j] = temp;
}

用函数指针实现qsort

   更改后的qsort函数可以处理任意类型的数据类型。该函数是函数指针的经典应用。

void qsort(void* v[], int left, int right, int (*comp)(void *, void *));
int f(int a, int b);
int main()
{
	int i;
	int a[10] = {1, 2, 45, -4, 322, 21, 23, 45, 8, 0};
        qsort((void **)a, 0, sizeof(a)/sizeof(int) - 1,(int(*)(void *, void *))f);
        for(i = 0; i < sizeof(a)/sizeof(int); i++)
        {
           	printf("%d ", a[i]);
        }
	printf("\n");
	return 0;
}
int f(int a, int b)
{
	if(a == b)
		return 0;
	if(a < b)
		return -1;
	if(a > b)
		return 1;
}
/*快速排序*/
void qsort(void * v[], int left, int right, int (*comp)(void *, void *))
{
	int i, last;
	void swap(void *v[], int i, int j);

        if(left >= right)
		return;
	swap(v, left, (left + right)/2);
 	last = left;
	for(i = left + 1; i <= right; i++)
	{	
		if((*comp)(v[i], v[left]) < 0)
		{	
			swap(v, ++last, i);
		}
        }
	swap(v, left, last);
	qsort(v, left, last - 1, comp);
   	qsort(v, last + 1, right, comp);       
}

/*交换v[i], v[j]的值*/
void swap(void *v[], int i, int j)
{
 	void * temp;
        temp = v[i];
        v[i] = v[j];
	v[j] = temp;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值