AllSight

C语言 · 运用结构体的排序方法

  之前遇到排序只想着最原始的方法,诸如冒泡,选择,快速排序等等,刚刚跟大牛学会了结构体的方法来排序,这样的话以后再也不用怕成绩统计、名次排序之类的题目了。

首先头文件(基于大牛的方法,本人之后做题喜欢引入题目中常用的五个头文件)

1
2
#include<stdlib.h>
#include<string.h>

定义结构体:

1
2
3
4
5
6
/*定义一个结构体*/
typedef struct Stu{
char name[10];
int id;
int score;
}stu;

注释:最后一行stu是别名。

定义排序(回调)函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*定义排序函数*/
int cmp(const void *a,const void *b){
    stu c = *(stu*)a;
    stu d = *(stu*)b;
    //printf("%d\n",strcmp(c.name,d.name));
    if(strcmp(c.name,d.name)>0){/*返回值是0、1*/<br>      return strcmp(c.name,d.name);
    }
    else{
        if(strcmp(c.name,d.name)==0){
            return c.id-d.id;
        }
    }
}

或者:

1
2
3
int cmp(const void *c,const void *d){
    return *(int *)c - *(int *)d;
}

使用qsort函数:

1
qsort(st,n,sizeof(st[0]),cmp);
头文件:stdlib.h用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));参数: 1 :待排序数组首地址;2 :数组中待排序元素数量;3 :单个元素的大小,推荐使用sizeof(st[0])这样的表达式;4 :指向函数的指针,用于确定排序的顺序.

下面给出一个成绩排序程序的完整代码:

代码一:原始方法:

 1 #include<stdio.h>2 #include<string.h>3 int main()4 {5     int n;6     char name[20];7     char sex[20];8     char year[20];9     int score[200];
10
11     int max = -1;
12     int mix = 200;
13     /*最高分者信息*/
14     char maxname[20];
15     char maxsex[20];
16     char maxyear[20];
17     /*最低分者信息*/
18     char mixname[20];
19     char mixsex[20];
20     char mixyear[20];
21
22     scanf("%d",&n);
23     for(int i=0;i<n;i++){
24         scanf("%s",name);
25         scanf("%s",sex);
26         scanf("%s",year);
27         scanf("%d",&score[i]);
28         /*若当前输入的分数比mix小,则将此条信息记录为最低分者*/
29         if(score[i]<mix){
30             strcpy(mixname,name);
31             strcpy(mixsex,sex);
32             strcpy(mixyear,year);
33             mix = score[i];
34         }
35         /*若当前输入的分数比max大,则将此条信息记录为最高分者*/
36         if(score[i]>max){
37             strcpy(maxname,name);
38             strcpy(maxsex,sex);
39             strcpy(maxyear,year);
40             max = score[i];
41         }
42     }
43     printf("\n最高者:%s\t性别:%s\t年龄:%s\n",maxname,maxsex,maxyear);
44     printf("最低者:%s\t性别:%s\t年龄:%s\n",mixname,mixsex,mixyear);
45 } 

代码二:结构体排序:

 1 #include<stdio.h>2 #include<string.h> 3 #include<stdlib.h>4 #include<math.h>5 #include<ctype.h>6 /*定义一个结构体*/7 typedef struct Stu{8     char name[100];9     char sex[10];
10     int age;
11     int score;
12 }stu;
13 /*    定义排序(回调)函数cmp:
14         返回类型必须是int;
15         两个参数的类型必须都是const void *;
16         如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0;
17 */
18 int cmp(const void *a,const void *b){
19     /* *(stu*)a是因为:a是个void *类型,要先
20     用(stu*)将它转成stu*类型,然后再用*取值,
21     变成stu类型,才能比较大小。*/
22     stu c=*(stu*)a;
23     stu d=*(stu*)b;
24     //按成绩升序排序
25     return c.score-d.score;
26 }
27 main(){
28     int n;
29     stu sz[100];
30     scanf("%d",&n);
31     for(int i=0;i<n;i++){
32         scanf("%s %s %d %d",&sz[i].name,&sz[i].sex,&sz[i].age,&sz[i].score);
33     }
34     /*
35     qsort函数参数:
36         1 待排序数组首地址;
37         2 数组中待排序元素数量;
38         3 各元素的占用空间大小,推荐使用sizeof(s[0])这样,特别是对结构体 ;
39         4 指向函数的指针,用于确定排序的顺序.
40     注意:如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要
41 在第一个和第二个参数上进行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);
42     */
43     qsort(sz,n,sizeof(sz[0]),cmp);
44     printf("\n按成绩升序为:\n\n");
45     for(int i=0;i<n;i++){
46         printf("%s %s %d %d\n",sz[i].name,sz[i].sex,sz[i].age,sz[i].score);
47     }
48 }

C语言 · 运用结构体的排序方法相关推荐

  1. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  2. C++结构体多级排序的三种方法

    C++结构体多级排序的三种方法 struct node{int chinese,math;char name[15]; }; 需求:按数学成绩从大到小排序  1.自定义比较器 //自定义比较函数 bo ...

  3. C语言定义一个结构体方法,C语言结构体定义的方法汇总

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  4. c语言结构体定义坐标,C语言结构体定义的方法汇总

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  5. c语言将结构体存储在数组中,结构体数组方法用法 _C语言-w3school教程

    C语言 的 结构体数组 在C语言编程中可以将一系列结构体来存储不同数据类型的许多信息. 结构体数组也称为结构的集合. 我们来看一个数组结构体的例子,存储5位学生的信息并打印出来.创建一个源文件:str ...

  6. C语言结构体自定义排序

    结构体自定义排序: 在最基础的C语言中,排序较为简单的有三种:冒泡,选择,插入.其中选择最劣.复杂一点的有快速排序和归并排序,在这里后两种我就不介绍了. 在使用结构体排序的时候,里面可能有许多不同的对 ...

  7. C语言 基于结构体的程序设计(PTA)

    一.实验目的 1.掌握C语言中结构体类型的定义和结构体变量的定义和引用. 2.掌握用结构指针传递结构数据的方法. 二.实验内容 1. 计算职工工资 给定N个职员的信息,包括姓名.基本工资.浮动工资和支 ...

  8. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  9. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

最新文章

  1. android studio gradle 位置更改
  2. matlab while循环
  3. 如何打开MDI文档!
  4. Linux内核分析:完成一个简单的时间片轮转多道程序内核代码
  5. 信息系统项目管理师论文考试汇总(2010~2021年)
  6. Hibernate一对多关联映射及cascade级联操作
  7. 架构之:软件架构漫谈
  8. 贪心策略取得最优解的条件_什么是贪心算法?
  9. Java 8.if语句
  10. 我的招聘网——用户登录模块设计与实现
  11. iOS编程比较好开源的完整项目iOS编程比较好开源的完整项目
  12. Windows命令--wmic
  13. Google_翻译整个PDF文件为英文
  14. 阿里云网盘:阿里云盘公测预约中,附官网地址入口
  15. 苹果4s怎么越狱_iPhone 12系列细节曝光:苹果调整屏幕尺寸
  16. Java 实例 - 字符串小写转大写
  17. idea使用lombok的时候无法找到log,编译时无法找到log
  18. Android源码配置第三方应用电池白名单流程分析笔记
  19. 深度学习:长短期记忆模型LSTM
  20. 智慧公寓管理系统解决方案

热门文章

  1. Git:工作原理(核心)
  2. LPCWSTR与string相互转换
  3. java8使用stream流将list转map
  4. mysql hive 建表_hive建表报错
  5. pulsar最佳实践
  6. 雅思核心词拾遗01----Politics + Culture
  7. 如何提取app软件的apk格式中的字体?
  8. C语言 extern的用法
  9. 如何防范 PHP安全的方式-session会话劫持与会话固定 ?
  10. Keras 优化器总结