C和指针第13章第4题
题目:编写一个函数,它用于对一个任何类型的数组进行排序。
算法核心代码sort函数实现
/**
功能说明:sort函数可以对不同类型的数据进行排序
参数:
1、一个指向需要排序的数组的第一个值的指针。
2、数组中元素的个数。
3、每个数组元素的长度。
4、一个指向比较回调函数的指针
**/
void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))
{
char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下
//简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序
for(int i = ; i < size; i++)
for(int j = ; j < size-i; j++)
{
if(cmp(pc+(j-)*element_size,pc+j*element_size) < )
{
void *p = malloc(element_size);//分配一个string大小的内存
//交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容
memcpy(p,pc+j*element_size,element_size);
memcpy(pc+j*element_size,pc+(j-)*element_size,element_size);
memcpy(pc+(j-)*element_size,p,element_size);
free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露
}
}
}
字符串比较函数,这里是第二个大于第一个返回值大于0,相等等于0,第二个数小于第一个返回值小于0
//string 比较
int string_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
assert(num1 != NULL && num2 != NULL);
while(*num1 != '\0' && *num2 != '\0')
{
if(*num1 == *num2)
{
num1++;
num2++;
continue;
}
break;
}
return *num2-*num1; }
测试代码,全部代码
/*************************************************************************
> File Name: sort.c
> Created Time: 2014年06月17日 星期二 23时22分34秒
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h> /**
功能说明:sort函数可以对不同类型的数据进行排序
参数:
1、一个指向需要排序的数组的第一个值的指针。
2、数组中元素的个数。
3、每个数组元素的长度。
4、一个指向比较回调函数的指针
**/
void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))
{
char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下
//简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序
for(int i = ; i < size; i++)
for(int j = ; j < size-i; j++)
{
if(cmp(pc+(j-)*element_size,pc+j*element_size) < )
{
void *p = malloc(element_size);//分配一个string大小的内存
//交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容
memcpy(p,pc+j*element_size,element_size);
memcpy(pc+j*element_size,pc+(j-)*element_size,element_size);
memcpy(pc+(j-)*element_size,p,element_size);
free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露
}
}
} //int比较
int int_cmp(void const *a,void const *b)
{
int *num1 = (int *)a;
int *num2 = (int *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
}
//double比较
int double_cmp(void const *a,void const *b)
{
double *num1 = (double *)a;
double *num2 = (double *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
} //char 比较
int char_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
} //string 比较
int string_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
assert(num1 != NULL && num2 != NULL);
while(*num1 != '\0' && *num2 != '\0')
{
if(*num1 == *num2)
{
num1++;
num2++;
continue;
}
break;
}
return *num2-*num1; } int main()
{ //int 数组
int array[] = {,,,,,};
printf("int 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%d ",array[i]);
printf("\n");
sort(array,,sizeof(int),int_cmp);
printf("int 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%d ",array[i]);
printf("\n"); //double 数组
double array_d[] = {3.16,2.5,6.49,10.5,0.4};
printf("double 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%lf ",array_d[i]);
printf("\n");
sort(array_d,,sizeof(double),double_cmp);
printf("double 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%lf ",array_d[i]);
printf("\n"); //char
char array_c[] = {'E','C','A','D','B'};
printf("char 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%c ",array_c[i]);
printf("\n");
sort(array_c,,sizeof(char),char_cmp);
printf("char 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%c ",array_c[i]);
printf("\n");
//string 数组排序
char array_s[][] = {"yello","world","herb","herd","sort"};
printf("string 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%s ",array_s[i]);
printf("\n");
sort(array_s,,sizeof(char)*,string_cmp);
printf("string 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%s ",array_s[i]);
printf("\n"); return ;
}
运行结果:

C和指针第13章第4题的更多相关文章
- C和指针第七章第五题
实现一个简化的printf函数,能够处理%d,%f,%s,%c等格式. /*************************************************************** ...
- Linux就这个范儿 第13章 打通任督二脉
Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...
- 【STM32H7教程】第13章 STM32H7启动过程详解
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章 STM32H7启动过程详解 本章教 ...
- 【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器
第13章 RL-TCPnet之TCP服务器 本章节为大家讲解RL-TCPnet的TCP服务器实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 第13章 GPIO-位带操作—零死角玩转STM32-F429系列
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- C++ primer plus读书笔记——第13章 类继承
第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
- 《深入Java虚拟机学习笔记》- 第13章 逻辑运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
随机推荐
- RRT路径规划算法
传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...
- Mysql中字符串正确的连接方法
虽然SQL server和My sql的语句基本都一致,但是仍然存在一些小区别.就如字符串的连接来说,SQL server中的字符串连接是使用“+”来连接,不带引号sql server是做加法运算.而 ...
- vs code 问题:preLaunchTask“build”已终止,退出代码为 1。解决办法
菜单:任务-配置任务 改为如下: { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation ab ...
- ContentResolver.query()—>buildQueryString()
Cursor cursor = context.getContentResolver().query(Sms.CONTENT_URI, new String[]{"threa ...
- jsp空指针异常
1.Tomcat启动后访问首页报错 显示JSP 空指针异常 这哥们是因为lib下jar包和Tomcat下的jar包冲突,去掉lib下 servlet-api-2.5.jar 以及jsp-api.jar ...
- boost boost::asio::read socket.read_some 区别
boost boost::asio::read 尝试读一定数量的字节,直到读到为止,或者出错 socket.read_some 读一下socket,读到多少算多少 带async的类似
- 【RS】Using graded implicit feedback for bayesian personalized ranking - 使用分级隐式反馈来进行贝叶斯个性化排序
[论文标题]Using graded implicit feedback for bayesian personalized ranking (RecSys '14 recsys.ACM ) [论文 ...
- 树莓派 SD卡镜像备份
一.准备工作 1.已经配置启动的树莓派SD卡 2.Linux系统的pc 3.读卡器 二.修改SD卡文件 刚开始我先再win7下把SD卡接到pc上,发现无法读取.用DISKGENIUS查看pc的磁盘状态 ...
- Charles 网络抓包工具
1.Charles 简介 Charles 是在 Mac.Linux 或 Windows 下常用的 http 协议网络包截取工具,在平常的测试与调式过程中,掌握此工具就基本可以不用其他抓包工具了.Cha ...
- aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云1/2】
如何让用户点,我们可以获得经纬度,我们就要先了解下它给我们提供的百度地图的事件 主要有两个操作事件的,绑定(addEventListener)和解绑(removeEventListener) 一些事件 ...