首页 > 代码库 > C语言 · 运用结构体的排序方法

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

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

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

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

定义结构体:

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

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

定义排序(回调)函数:

/*定义排序函数*/ 
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*/
return strcmp(c.name,d.name); } else{ if(strcmp(c.name,d.name)==0){ return c.id-d.id; } } }

或者:

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

  

使用qsort函数:

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 :各元素的占用空间大小;
4 :指向函数的指针,用于确定排序的顺序.

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

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 /*定义一个结构体*/
 5 typedef struct Stu{
 6     char name[10];
 7     int id;
 8     int score;
 9 }stu;
10 /*定义排序函数*/ 
11 int cmp(const void *a,const void *b){
12     stu c = *(stu*)a;
13     stu d = *(stu*)b;
14     printf("%d\n",strcmp(c.name,d.name));
15     if(strcmp(c.name,d.name)>0){
16         return strcmp(c.name,d.name);
17     }
18     else{
19         if(strcmp(c.name,d.name)==0){
20             return c.id-d.id;
21         }
22     }
23 }
24 main(){
25     int n;
26     stu st[10];
27     scanf("%d",&n);
28     for(int i=0;i<n;i++){
29         scanf("%s %d %d",st[i].name,&st[i].id,&st[i].score);
30     }
31     qsort(st,n,sizeof(st[0]),cmp);
32     for(int i=0;i<n;i++){
33         printf("%s %d %d\n",st[i].name,st[i].id,st[i].score);
34     }
35 }

 

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