函数的指针(一)写一个能对任意数组排序的冒泡排序

MyFunc.cpp文件内容

 1 void swap (char *a, char *b, size_t width){
 2     char tmp;
 3     while(width--){
 4         tmp = *a;
 5         *a++ = *b;
 6         *b++ = tmp;
 7     }
 8 }
 9 //冒泡排序 base:数组首地址 num:数组元素个数 width:数组元素的字节 comp:为函数指针
10 void BubbleSort(void *base, size_t num, size_t width, int (*comp)(const void *, const void *)){
11     char *end = (char *)base + num * width;
12     for(char *i = (char *)base; i < end; i += width){
13         for(char *j = i + width; j < end; j += width){
14             if((*comp)(i, j) > 0){
15                 swap(i, j, width);
16             }
17         }
18     }
19 }

MyFunc.h文件内容

1 void BubbleSort(void *, size_t , size_t , int (*)(const void *, const void *));

Main.cpp文件内容

 1 //
 2 //2016年6月1日 18:00
 3 //
 4 //爱白菜的小昆虫
 5 //
 6 //写一个对任意数组冒泡排序函数……
 7 //通过这个例子对空指针的运用
 8 //通过这个例子对函数指针的使用
 9 //
10 
11 
12 #include <stdio.h>
13 
14 #include "MyFunc.h"
15 
16 #define N 10
17 
18 struct Point{
19     int x;
20     char *str;
21 } p[] = {
22     {9, "nine"}, {8, "eight"}, {7, "seven"}, {6, "six"}, {5, "five"},
23     {4, "four"}, {3, "three"}, {2, "two"}, {1, "one"}, {0, "zero"}
24 };
25 
26 int cmp1(const void *x, const void *y){
27     Point *a = (Point *)x,
28         *b = (Point *)y;
29     return a->x - b->x;
30 }
31 //自己写比较函数
32 int cmp(const void *x, const void *y){
33     int *a = (int *)x, 
34         *b = (int *)y;
35     return *a - *b;
36 }
37 
38 //自己写一个对任意数组都能排序的冒泡排序
39 int main(){
40     int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
41 
42     puts(""); for(int i = 0; i < N; ++i) printf("%d ", arr[i]);
43     BubbleSort(arr, N, sizeof(int), cmp);
44     puts(""); for(int i = 0; i < N; ++i) printf("%d ", arr[i]);
45     puts("");
46     
47     puts("按照x升序");
48     puts("排序前:"); for(int i = 0; i < N; ++i) printf("%d %s\n", p[i].x, p[i].str);
49     BubbleSort(p, N, sizeof(Point), cmp1);
50     puts("排序后:"); for(int i = 0; i < N; ++i) printf("%d %s\n", p[i].x, p[i].str);
51 
52     return 0;
53 }

运行效果:

转载于:https://www.cnblogs.com/xuqiulin/p/5550922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值