回调函数是什么?
回调函数就是⼀个通过函数指针调用的函数。例如上个博客中提到的转移表:
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
void calc(int(*pf)(int, int))
{
int ret = 0;
int x, y;
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("ret = %d\n", ret);
}
int main()
{
int input = 1;
do
{
printf("************************\n");
printf("***** 1:add 2:sub ****\n");
printf("***** 3:mul 4:div ****\n");
printf("***** 0:exit ****\n");
printf("************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
calc(add);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
qsort函数
由此我们可以大致知道qsort函数的用法。
#include <stdio.h>
//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 - *(int *)p2);
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
qsort函数不仅能用来排序数字,还能排序各种类型元素:
#include<stdio.h>
#include<string.h>
int com_char(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
void print(char* str, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c ",*(str+i));
}
printf("\n");
}
void test2()
{
char str[] = "DSIOPXLK";
int sz = strlen(str);
qsort(str, sz, sizeof(char), com_char);
print(str, sz);
}
int main()
{
test2();
return 0;
}
qsort函数的模拟实现
使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 - *(int *)p2);
}
void _swap(void *p1, void * p2, int size)
{
int i = 0;
for (i = 0; i< size; i++)
{
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
}
void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
int i = 0;
int j = 0;
for (i = 0; i< count - 1; i++)
{
for (j = 0; j<count - i - 1; j++)
{
if (cmp((char *)base + j*size, (char *)base + (j + 1)*size) > 0)//强制类型转换为char*是为了方便j*zize的计算方便,是加上后的数正好是后一个数。
{
_swap((char *)base + j*size, (char *)base + (j + 1)*size, size);
}
}
}
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}