当前位置: 首页 > news >正文

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类型的参量与指示的函数的参数类型必须完全匹配不然会无法运行。

我这次尝试了把函数定义放在主程序后面,也是比较经典的操作了!

http://www.xdnf.cn/news/1184941.html

相关文章:

  • [python][flask]Flask-Principal 使用详解
  • 秋招Day19 - 分布式 - 理论
  • CentOS 8 安装HGDB V4.5 psql命令执行报错
  • [python][flask]Flask-Login 使用详解
  • Mysql实现高可用(主从、集群)
  • Git指令
  • PyCharm高效开发全攻略
  • uniapp使用css实现进度条带动画过渡效果
  • OSPF之多区域
  • Lua(面向对象)
  • 苍穹外卖Day6
  • OSPF 协议(多区域)
  • 【动态规划:斐波那契数列模型】解码方法
  • Uniapp编写微信小程序,绘制动态圆环进度条
  • LIMA:大语言模型对齐的“少即是多”革命——原理、实验与范式重构
  • 软件工程:软件需求
  • 图书推荐-由浅入深的大模型构建《从零构建大模型》
  • 【模型剪枝1】结构化剪枝论文学习笔记
  • k8s-MongoDB 副本集部署
  • XORIndex:朝鲜不断发展的供应链恶意软件再次瞄准 npm 生态系统
  • Kubernetes配置管理
  • Axios基本使用
  • GUI界面已经移植完,添加欠缺字,微调GUI界面说明
  • Kafka运维实战 15 - kafka 重设消费者组位移入门和实战【实战】
  • 时间和空间复杂度
  • 八股文之JVM
  • DNS 服务正反向解析与 Web 集成实战:从配置到验证全流程
  • Day 21: 常见的降维算法
  • 专题:2025电商增长新势力洞察报告:区域裂变、平台垄断与银发平权|附260+报告PDF、原数据表汇总下载
  • 小米8(dipper)刷入kernelSU内核root定制rom系统教程以及安装LSPosed模块