学习记录—回调函数和指针函数的运用
程序员文章站
2022-07-15 09:33:29
...
14.程序设计-排序
编写一个名叫sort的函数,它用于对一个任何类型的数组进行排序,为了使函数更为通用,它的其中一个参数必须是一个指向比较回调函数的指针,该回调函数由调用函数提供两个参数,也就是两个指向需要进行比较的值的指针。如果两个值相等,函数返回零;如果第1个值小于第2个,函数返回一个小于零的整数:如果第1个值大于第2个,函数返回一个大于零的整数。
Sort函数的参数将是:
1、一个指向需要排序的数组的第一个值的指针
2、数组中值的个数
3、每个数组元素的长度
4、一个指向比较回调函数的指针
Sort函数没有返回值。
你将不能根据实际类型声明数组参数,因为函数应该可以对不同类型的数组进行排序。如果你把数据当作一个字符数组使用,你可以用第3个参数寻找实际数组中每个元素的起始位置,也可以用它交换两个数组元素(每次一个字节)
#include <stdio.h>
typedef int (*Compare)(void *a, void *b);
typedef void (*Swap)(void *a, void *b);
void sort(void *arr, int size, int len, Compare compare, Swap swap);
int compare_int(void *a, void *b)
{
if(*(int *)a > *(int *)b)
{
return 1;
}
else if(*(int *)a == *(int *)b)
{
return 0;
}
return -1;
}
int compare_char(void *a, void *b)
{
if(*(char *)a > *(char *)b)
{
return 1;
}
else if(*(char *)a == *(char *)b)
{
return 0;
}
return -1;
}
void swap_int(void *a, void *b)
{
int* p1=(int*)a;
int* p2=(int*)b;
int temp = 0;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap_char(void *a, void *b)
{
char* p1=(char*)a;
char* p2=(char*)b;
char temp = 0;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
typedef void (*Printf)(void *arr, int size);
void printf_int(void *arr, int size)
{
int *p = (int *)arr;
int i = 0;
for(;i < size;i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
void printf_char(void *arr, int size)
{
char *p = (char *)arr;
int i = 0;
for(;i < size;i++)
{
printf("%c ",*p);
p++;
}
printf("\n");
}
int main()
{
int num=10;
int a_int[10]={9,2,3,8,1,5,6,4,7,12};
char c_char[10]={'g','h','t','a','d','w','q','b','m','c'};
sort(a_int,sizeof(a_int)/sizeof(int),sizeof(int),compare_int, swap_int);
sort(c_char,sizeof(c_char)/sizeof(char),sizeof(char),compare_char, swap_char);
printf_char(c_char, sizeof(c_char)/sizeof(char));
printf_int(a_int, sizeof(a_int)/sizeof(int));
}
void sort(void *arr, int size, int len, Compare compare, Swap swap)
{
int i = 0, j = 0;
char* test=(char*)arr;
for(i = 0; i < size - 1; i++)
{
//先搞定一趟排序,利用冒泡排序将最大值放在最后一个数组的位置上
for(j = 0; j < size - i -1; j++)
{
//取前一个数和后一个数进行对比,将大的数据放在后一个位置上
if(compare(test+j*len,test+(j+1)*len) == 1)
{
swap(test+j*len,test+(j+1)*len);
}
}
}
}
上一篇: 指针在函数中的运用
下一篇: 排序算法中比较函数的运用
推荐阅读
-
PHP 回调函数call_user_func和 call_user_func_array()的理解
-
JavaScript中的回调函数的基本理解和实例介绍
-
学习记录—回调函数和指针函数的运用
-
canOpen学习十二之canOpen回调函数的定义与使用
-
C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)
-
js回调函数在项目中的运用
-
python 回调函数和回调方法的实现分析
-
C# 如何调用 C++ DLL中的函数接口和回调函数
-
在学习中遇到无法使用数组地图删除文件的情况,报错是回调函数unlink 有问题~请帮帮忙!感谢!
-
方便地将 C++ 成员函数和函数对象转换成 C 风格的回调函数指针 CC++C#HTML