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

函数指针的用法

按结构体字段进行排序

#include<stdio.h>
#include<string.h>

int compare(void *, void *, int (*)(void *, void *));
int orderById(void *, void *);
int orderByName(void *, void *);
int orderByAge(void *, void *);

struct Student {
    int id;
    char name[64];
    int age;
    char address[1024];
};

void arrSort(struct Student *, int, int (*)(void *, void *));

int main(void)
{
    struct Student arr[5] = {{
        20140101,
            "zhangsan",
            24,
            "china.guangzhou"
    }, {
        20140103,
            "lisi",
            28,
            "USA.ny"
    }, {
        20140102,
            "wangwu",
            18,
            "UK"
        }, {
            20140110,
                "zhaoliu",
                19,
                "china.peking"
        }, {
            20140131,
                "fwy",
                27,
                "china.nc"
        }};

    printf("\n-----------id升序-----------------\n");
    arrSort(arr, 5, orderById);
    
    printf("\n-----------name升序-----------------\n");
    arrSort(arr, 5, orderByName);

    printf("\n-----------age升序-----------------\n");
    arrSort(arr, 5, orderByAge);
}

//统一比较函数
int compare(void * stu, void * stu2, int (*pt)(void *, void *))
{
    return (*pt)(stu, stu2);
}

//按Id升序排列
int orderById(void * stu, void * stu2)
{
    struct Student s = *((struct Student *)stu);
    struct Student s2 = *((struct Student *)stu2);

    return s2.id - s.id;
}

//按name升序排列
int orderByName(void * stu, void * stu2)
{
    struct Student s = *((struct Student *)stu);
    struct Student s2 = *((struct Student *)stu2);

    return strcmp(s2.name, s.name);
}

//按age升序排列
int orderByAge(void * stu, void * stu2)
{
    struct Student s = *((struct Student *)stu);
    struct Student s2 = *((struct Student *)stu2);

    return s2.age - s.age;
}

//结构体数组排序
void arrSort(struct Student * arr, int size, int (*pt)(void *, void *))
{
    int i,j;
    struct Student temp;

    for(i = 0; i < size -1; i++)
    {
        for(j = 0; j < size - 1 - i; j++)    
        {
            if(compare(&arr[j], &arr[j + 1], pt) < 0)
            {
                temp = arr[j];  
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    for(i = 0; i < size; i++)
    {
        printf("%10d %10s %3d %15s\n", arr[i].id, arr[i].name, arr[i].age, arr[i].address);
    }
}

 

转载于:https://www.cnblogs.com/itpoorman/p/3875472.html

相关文章:

  • HW2017笔试编程题
  • Flex定时任务设置组件
  • 关于集合的size的操作
  • 理清文件编码,告别中文乱码
  • sublime text3简体中文版汉化教程
  • CAS(客户端)程序获取安全证书
  • FZU OJ 1056 :扫雷游戏
  • C++矢量图形库系列(1)——矢量图形库乱谈(转)
  • 关于引入文件名字问题
  • Nagios常见问题记录(1)
  • CSS3窗帘式4格焦点图代码
  • 谁是“少数幸福的人”?
  • 肝病案
  • C++函数的重载
  • 初步探讨WPF的ListView控件(涉及模板、查找子控件)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • centos安装java运行环境jdk+tomcat
  • ES6之路之模块详解
  • Just for fun——迅速写完快速排序
  • October CMS - 快速入门 9 Images And Galleries
  • PAT A1092
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • spring学习第二天
  • storm drpc实例
  • Vue2.0 实现互斥
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从0到1:PostCSS 插件开发最佳实践
  • 力扣(LeetCode)965
  • 微服务核心架构梳理
  • 带你开发类似Pokemon Go的AR游戏
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #AngularJS#$sce.trustAsResourceUrl
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014#Day.2 T3 解方程
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)Android开发优化---------UI优化
  • (4)事件处理——(7)简单事件(Simple events)
  • (HAL库版)freeRTOS移植STMF103
  • (LeetCode 49)Anagrams
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (南京观海微电子)——I3C协议介绍
  • (算法设计与分析)第一章算法概述-习题
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (原創) 物件導向與老子思想 (OO)
  • (转)setTimeout 和 setInterval 的区别
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET MVC之AOP
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复