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是别名。定义排序(回调)函数:
sizeof结构体大小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 3int cmp(const void*c,const void*d){ return*(int*)c - *(int*)d;
}
使⽤qsort函数:
1qsort(st,n,sizeof(st[0]),cmp);
头⽂件:
⽤法: 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 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论