C语言指针初步(4)-用void指针模拟qsort函数方法
注:本处模拟qsort函数使用的是一个比较大小的bigger函数作为演示!并实现了冒泡排序操作!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main() {int arr[30] = { 0 };int x = 0;printf("Please enter any array,ends with “4399”\n");while (1) {scanf("%d", &arr[x]);if (arr[x] != 4399) {x++;}else {break;}}int Size = 0;int num = 0;int bigger(const void* a, const void* b);num = x - 1;Size = sizeof(arr[0]);//printf("%d\n", Size);void bubble_fir(void* Arr, int length, int len, int (*cmp)(const void* e1, const void* e2));int checkdone(void* Arr2, int length, int len);while (checkdone(arr, Size, num) > 0) {bubble_fir(arr, Size, num, bigger);}int cl = 0;printf("Bubble sort stimulated as :\n");while (cl < num+1) {printf("%d ", arr[cl]);cl++;}return 0;
}
int checkdone(void* Arr2, int length, int len) {int sum = 0; int t = 0;while (t < len-1) {if (*((int*)Arr2 + t /** length*/) > *((int*)Arr2 + (t + 1) /** length*/)) {sum++;}if (sum > 0) {return 1;//break;}else {t++;}}return 0;
}
void bubble_fir(void* Arr, int length, int len, int (*cmp)(const void* e1, const void* e2)) {int i = 0; int j = 0;while (i < len-1) {if (cmp((char*)Arr + i * length, (char*)Arr + (i+1) * length) > 0) {while (j < 4) {char pointer = *((char*)Arr + i * length + j);*((char*)Arr + i * length + j) = *((char*)Arr + (i + 1) * length + j);*((char*)Arr + (i + 1) * length + j) = pointer;j++;}j = 0;i++;}else {i++;}}
}
int bigger(const void* a, const void* b) {if (*(int*)a >= *(int*)b) {return 1;}elsereturn 0;
}
该方法优势在于:不使用qsort函数本身即可示现qsort函数功能,通过对void指针进行强制类型转换来完成取值与传参的操作,
我对他进行了一些改造现在它可以被用于30个数字以内的所有整形数组,但是最好不要使用4399这个数字本身(你必须意识到,如果你需要使用其他的排列方法比如字符串排列的话,这里的arr[ ]数组类型应进行相应的修改而不是继续维持int的类型。)
必须注意bubble_fir函数中的那个函数指针的const void类型的参量与指示的函数的参数类型必须完全匹配不然会无法运行。
我这次尝试了把函数定义放在主程序后面,也是比较经典的操作了!