通过冒泡排序的快速排序练习使用回调函数
来源:互联网 发布:睡衣 知乎 编辑:程序博客网 时间:2024/06/09 17:54
首先什么是回调函数?回调函数是什么?
函数指针作为调用函数的参数,通过这个指针可以回调这个指针指向的函数,这样的技巧就是利用回调函数,回调函数就是这个指针指向的函数。
一个简单的例子:
<span style="font-size:18px;">#include<stdio.h>#include<stdlib.h>void fun(){printf("hello ");}void pfun(void (*p)()) //函数的参数是一个函数指针(是一个地址){p(); //在内部通过函数指针来调用指向的函数printf("world\n");}int main(){void (*q)(); //定义一个函数指针q = fun; //指向fun()pfun(q);system("pause");return 0;}</span>
结果是这样的:
可以看到pfun()函数通过函数指针调用到了fun()这个函数,我们这个时候可以称fun()是个回调函数,下面是对冒泡排序使用回调函数用例
#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h> /*指针数组的比较函数<span style="color:#ff0000;font-weight: bold;">函数接受的是指针数组的元素的地址,指针数组元素的内容是一个指针所以接收到之后进行强制转换成(int *)再解引用得到字符串的首地址强制转换成(char *)进行操作</span>*/int cmpstr(const void *elem1, const void *elem2){assert(elem1&&elem2);return strcmp((char *)(*(int *)elem1), (char *)(*(int *)elem2));}/*字符数组的比较*/int cmpch(const void *elem1, const void *elem2){assert(elem1&&elem2);return *(char *)elem1 - *(char *)elem2;}/*整形数组的比较*/int cmpint(const void *elem1, const void *elem2){assert(elem1&&elem2);return *(int *)elem1 - *(int *)elem2;}/*交换函数交换的时候是以字节为单位交换<span style="color:#ff0000;"><strong>这样的话必须显示的给出数据类型的字节数</strong></span>*/void swap(void *elem1, void *elem2, int width) //函数接收的是无类型的指针所以一定要进行类型转换{assert(elem1&&elem2);int i = 0;for (i = 0; i < width; i++){char tmp = *((char*)elem1+i);*((char *)elem1+i) = *((char*)elem2+i);*((char*)elem2+i) = tmp;}}/******************************************<span style="color:#ff0000;"><strong>冒泡排序的快速排序函数接收base数组名sz数组大小width数组元素的大小(字节)int(*compare)(const void *elem1, const void *elem2)一个函数指针这个函数主要是利用函数指针通过回调函数来实现调用者的参数是一个函数指针,通过这个指针可以调用函数这样调用者可以和被调用者分开提高了可移植性</strong></span>*/void bubble(void *base, int sz, int width, int(*compare)(const void *elem1, const void *elem2)){int i = 0;int j = 0;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){if (compare((char *)base + j*width, (char *)base + (j + 1)*width)>0){ <span style="color:#ff0000;">//将数组名强制转换成(char *)对字节进行操作</span>swap((char *)base + j*width, (char *)base + (j + 1)*width, width);}}}}/*****************************测试用例*/int main(){int i = 0;char *p[3] = { "aaaaa", "eeeee", "bbbbb" };int b[5] = { 1, 9, 3, 5, 4 };char c[5] = { 'a', 'r', 'd', 'c', 'b' };bubble(p, sizeof(p) / sizeof(p[0]), sizeof(char *), cmpstr);bubble(b, sizeof(b) / sizeof(b[0]), sizeof(int), cmpint);bubble(c, sizeof(c) / sizeof(c[0]), sizeof(char), cmpch);for (i = 0; i < sizeof(p) / sizeof(p[0]); i++){printf("%s ", p[i]);}printf("\n");for (i = 0; i < sizeof(b) / sizeof(b[0]); i++){printf("%d ", b[i]);}printf("\n");for (i = 0; i < sizeof(c) / sizeof(c[0]); i++){printf("%c ", c[i]);}printf("\n");system("pause");return 0;}测试结果是这样的:
具体的分析都在程序中注释。
回调函数的应用还是建立在指针之上的,所以熟练的掌握c指针是我们学习c语言的重中之重!!!!
1 0
- 通过冒泡排序的快速排序练习使用回调函数
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 【C语言】 使用回调函数实现冒泡排序
- 使用回调函数实现qsort(冒泡排序)
- 回调函数实现冒泡排序
- 回调函数实现冒泡排序
- 冒泡排序之回调函数!
- 用回调函数实现冒泡排序
- 回调函数实现通用冒泡排序
- 用回调函数实现冒泡排序
- 通用冒泡排序(回调函数)
- 回调函数实现冒泡法的多种排序
- 《由浅到深使用回调函数 2》(快速排序)
- 【C语言】使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 通过冒泡排序(C语言实现)学习回调函数设计原理
- 【C语言】【笔试题】使用回调函数编写冒泡排序,可以排序整形数组,也可以排序字符串
- 冒泡排序和快速排序算法练习
- C语言冒泡排序之回调函数设计
- KissXML中的类报错的修改方法 报错:self->isa = [DDXMLDocument class];
- 如何修改程序标题, 菜单的字体
- 内存池技术畅想
- RCurl在linux安装问题
- html中js通过指定的年月获取该月的天数
- 通过冒泡排序的快速排序练习使用回调函数
- 创建通讯录及其详情页面
- linux下的查看帮助命令:whatis,man
- 2016年,这些邮件设计将颠覆营销圈!
- java语言的特性有什么
- 浅析总结 Android studio 中 Gradle 配置运行
- fragment getActivity()空指针
- Android Studio 修改Logcat的颜色
- linux免密码登录