c语言 结构体排序 相同 下一个,C语言 · 运用结构体的排序方法

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

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

定义结构体:

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

定义排序(回调)函数:

或者:

使用qsort函数:

头文件:stdlib.h

用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

参数:

1 :待排序数组首地址;

2 :数组中待排序元素数量;

3 :单个元素的大小,推荐使用sizeof(st[0])这样的表达式;

4 :指向函数的指针,用于确定排序的顺序.

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

代码一:原始方法:

49d1538ce6d6842890af438e8b748812.gif

1 #include

2 #include

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

24 scanf("%s",name);

25 scanf("%s",sex);

26 scanf("%s",year);

27 scanf("%d",&score[i]);

28 /*若当前输入的分数比mix小,则将此条信息记录为最低分者*/

29 if(score[i]

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 }

835e12f05f69793831db7261a0ba9b9d.gif

代码二:结构体排序:

e1b3b63161a9f05902ce69a3b200730a.gif

1 #include

2 #include

3 #include

4 #include

5 #include

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

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

46 printf("%s %s %d %d\n",sz[i].name,sz[i].sex,sz[i].age,sz[i].score);

47 }

48 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值