qsort()函数的头文件:<stdlib.h>;
qsort()的声明:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
参数:
- base -- 指向要排序的数组的第一个元素的指针。
- nitems -- 由 base 指向的数组中元素的个数。
- size -- 数组中每个元素的大小,以字节为单位。
- compar -- 用来比较两个元素的函数。
首先定义结构体:
typedef struct
{
char name[15];
long long int num; //学号
char sex[5]; //性别
char facu[7]; //院系
} stu;
定义结构体数组:
stu stus[N];
比较学号的函数:
int cmp(const void *a, const void * b)
{
int sim = ( (stu *)a )->num;
int big = ( (stu *)b )->num;
return sim - big;
}
比较姓名的函数:
int cmp02(const void *a, const void * b)
{
char *str1 = ( (stu *)a)->name;
char *str2 = ( (stu *)b)->name;
return strcmp(str1,str2);
}
下面来看整体代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
/*定义存放一个学生信息的结构体类型,学生信息包括:
姓名,学号,性别,院系*/
typedef struct
{
char name[15];
long long int num; //学号
char sex[5]; //性别
char facu[7]; //院系
} stu;
stu stus[N];
int cmp(const void *a, const void * b); //按学号进行排序
int cmp02(const void *a, const void * b); //按名字进行排序
int main()
{
//输入信息
for(int i = 0;i < N ;i++)
{
scanf("%s",stus[i].name);
scanf("%d",&stus[i].num);
scanf("%s",stus[i].sex);
scanf("%s",stus[i].facu);
}
puts("-----------------------------");
qsort(stus, N, sizeof(stus[0]), cmp02 ); //按姓名排序
puts("按姓名排序:");
for(int j = 0;j < N;j++)
{
printf("%s ",stus[j].name);
printf("%d ",stus[j].num);
printf("%s ",stus[j].sex);
printf("%s\n",stus[j].facu);
}
qsort(stus, N, sizeof(stus[0]), cmp ); //按学号排序
puts("-----------------------------");
puts("按学号排序:");
for(int j = 0;j < N;j++)
{
printf("%s ",stus[j].name);
printf("%d ",stus[j].num);
printf("%s ",stus[j].sex);
printf("%s\n",stus[j].facu);
}
return 0;
}
int cmp(const void *a, const void * b) //按学号排序
{
int sim = ( (stu *)a )->num;
int big = ( (stu *)b )->num;
return sim - big;
}
int cmp02(const void *a, const void * b) //按姓名排序
{
char *str1 = ( (stu *)a)->name;
char *str2 = ( (stu *)b)->name;
return strcmp(str1,str2);
}
输入:
运行结果: