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章 浮点运算
随机推荐
- mysql取年、月、日、时间
select id, phone,time,year(time),month(time), DAY(time),TIME(time) from user where phone='xxxxxx' # ...
- Redis从入门到精通:中级篇(转)
原文链接:http://www.cnblogs.com/xrq730/p/8944539.html,转载请注明出处,谢谢 本文目录 上一篇文章以认识Redis为主,写了Redis系列的第一篇,现在开启 ...
- Java微信分享接口开发
发布时间:2018-11-07 技术:springboot+maven 概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...
- 不可不知的Oracle常用技巧
不可不知的Oracle常用技巧 表复制 1.方法一:复制表结构和数据 create table temp_clientloginuser as select distinct userid from ...
- jeecg平台testDatagrid
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 题外话:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
以下文章虽然是编程,但是对于IT行业都通用 文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没 ...
- git学习笔记(一)—— git环境搭建
一.简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). 首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库 ...
- iOS 特定时间内才做某件事,有类似奇葩需求可以参考
我们项目启动的时候要弹出一个广告窗口,很简单的一个功能,服务器的判断一下满足条件,即返回数据,客户端判断数据部位NULL,则弹出弹窗但是老板说,这个要时间短弹出,每天的中午12点到下午2点不能弹出来这 ...
- GDataXMLNode:xml解析库
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- MongoDB学习笔记(6)--find
MongoDB 查询文档 MongoDB 查询文档使用 find() 方法. find() 方法以非结构化的方式来显示所有文档. 语法 MongoDB 查询数据的语法格式如下: db.collecti ...