周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写
定了,则称之为静态绑定;如果所有的变量和表达式的类型直到运行时才知道,则称之为动态绑定。
假设要实现一个用于任意数据类型的冒泡排序函数并简单测试,其要求是同一个函数既可以从大到小排列,也可以从小到大排列,且同时支持多种数据类型。比如:
int array[] = {39, 33, 18, 64, 73, 30, 49, 51, 81};
显然,只要将比较函数的入口地址compare_int传递给compare,即可调用bubbleSort():
int array[] = {39, 33, 18, 64, 73, 30, 49, 51, 81};
bubbleSort(array, numArray , sizeof(array[0]), compare_int);
在数量不大时,所有排序算法性能差别不大,因为高级算法只有在元素个数多于1000时,性能才出现显著提升。其实90%以上的情况下,我们存储的元素个数只有几十到几百个,冒泡排序可能是更好的选择,bubbleSort()的实现与使用范例程序详见程序清单 2.9。
程序清单 2.9 bubbleSort()冒泡排序范例程序
1 #include
2 #include
3 #include"bubbleSort.h"
4
5 int compare_int(const void * e1, const void * e2)
6 {
7 return *(int *)e1 - *(int *)e2;
8 }
9
10 int compare_int_r(const void * e1, const void * e2)
11 {
12 return *(int *)e2 - *(int *)e1 ;
13 }
14
15 int compare_str(const void * e1, const void *e2)
16 {
17 return strcmp(*(char **)e1, *(char **)e2);
18 }
19
20 void main()
21 {
22 int arrayInt[] = { 39, 33, 18, 64, 73, 30, 49, 51, 81 };
23 int numArray = sizeof(arrayInt) / sizeof(arrayInt[0]);
24 bubbleSort(arrayInt, numArray, sizeof(arrayInt[0]), compare_int);
25 for (int i = 0; i 26 printf("%d ", arrayInt[i]); 27 } 28 printf("\n"); 29 30 bubbleSort(arrayInt, numArray, sizeof(arrayInt[0]), compare_int_r); 31 for (int i = 0; i 32 printf("%d ", arrayInt[i]); 33 } 34 printf("\n"); 35 36 char * arrayStr[] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" }; 37 numArray = sizeof(arrayStr) / sizeof(arrayStr[0]); 38 bubbleSort(arrayStr, numArray, sizeof(arrayStr[0]), compare_str); 39 for (int i = 0; i < numArray; i++) { 40 printf("%s\n", arrayStr[i]); 41 } 42 } 由此可见,调用者main()与compare_int()回调函数都同属于上层模块,bubbleSort()属于下层模块。当上层模块调用下层模块bubbleSort()时,将回
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)
- 所有C语言数组和指针的知识都在这里了!|周立功手把手教你学C语言编程(08-01)