Ranbo_ 发表于 2020-2-27 14:15:40

qsort的比较函数以及用qsort对结构体排序

将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序由小到大排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序。

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

typedef struct Student
{
    char name;    //姓名
    int age;          //年龄
    int grade;         //分数
}student;

student stu;

int cmp(const void* s1, const void* s2)//比较结构体成员的大小,s1和s2是指向数组元素的指针
{
    student *stu1 = (student *) s1;
    student *stu2 = (student *) s2;

    if(stu1 -> grade != stu2 -> grade)    //stu1是结构体指针,需要用->访问结构体成员
      return (stu1 -> grade - stu2 -> grade);
    else if(strcmp(stu1 -> name, stu2 -> name) != 0)
      return strcmp(stu1 -> name, stu2 -> name);
    else
      return (stu1 -> age - stu2 -> age);
}

int main()
{
    int n;                //一共n名学生
    int i;
    while(scanf("%d", &n) != EOF)
    {
      for(i = 0; i < n; i++)
      {
            scanf("%s %d %d", stu.name, &(stu.age), &(stu.grade));//stu是结构体变量,要用.访问结构体成员
      }//输入信息
      qsort(stu, n, sizeof(stu), cmp);      //排序
      for(i = 0; i < n; i++)
      {
            printf("%s %d %d\n", stu.name, stu.age, stu.grade);
      }
    }
   
    return 0;
}




页: [1]
查看完整版本: qsort的比较函数以及用qsort对结构体排序