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

本文详细介绍如何使用C语言中的结构体和qsort函数进行学生信息的存储与成绩排序,包括定义结构体、实现排序函数及qsort函数的正确调用,最后展示排序后的学生名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题来源于成绩统计,名次排序

1.定义一个结构体

typedef struct Stu{
char name[10];
int id;
int score;
}stu;

2.定义排序(回调)函数:

/*定义排序函数*/
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;
        }
    }
}

或更精简
int cmp(const void *c,const void *d){
    return *(int *)c - *(int *)d;
}

3.使用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 :单个元素的大小,推荐使用sizeof(st[0])这样的表达式;
4 :指向函数的指针,用于确定排序的顺序.

一般采用思路

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    char name[20];
    char sex[20];
    char year[20];
    int score[200];
    
    int max = -1;
    int mix = 200;
    /*最高分者信息*/
    char maxname[20];
    char maxsex[20];
    char maxyear[20];
    /*最低分者信息*/ 
    char mixname[20];
    char mixsex[20];
    char mixyear[20];
    
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",name);
        scanf("%s",sex);
        scanf("%s",year);
        scanf("%d",&score[i]);
        /*若当前输入的分数比mix小,则将此条信息记录为最低分者*/
        if(score[i]<mix){
            strcpy(mixname,name);
            strcpy(mixsex,sex);
            strcpy(mixyear,year);
            mix = score[i];
        }
        /*若当前输入的分数比max大,则将此条信息记录为最高分者*/
        if(score[i]>max){
            strcpy(maxname,name);
            strcpy(maxsex,sex);
            strcpy(maxyear,year);
            max = score[i];
        }
    }
    printf("\n最高者:%s\t性别:%s\t年龄:%s\n",maxname,maxsex,maxyear);
    printf("最低者:%s\t性别:%s\t年龄:%s\n",mixname,mixsex,mixyear);
}

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
/*定义一个结构体*/
typedef struct Stu{
    char name[100];
    char sex[10];
    int age;
    int score;
}stu;
/*    定义排序(回调)函数cmp: 
        返回类型必须是int;
        两个参数的类型必须都是const void *;
        如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0;
*/ 
int cmp(const void *a,const void *b){
    /* *(stu*)a是因为:a是个void *类型,要先
    用(stu*)将它转成stu*类型,然后再用*取值,
    变成stu类型,才能比较大小。*/
    stu c=*(stu*)a;
    stu d=*(stu*)b;
    //按成绩升序排序 
    return c.score-d.score;
}
main(){
    int n;
    stu sz[100];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s %s %d %d",&sz[i].name,&sz[i].sex,&sz[i].age,&sz[i].score);
    }
    /*
    qsort函数参数: 
        1 待排序数组首地址;
        2 数组中待排序元素数量;
        3 各元素的占用空间大小,推荐使用sizeof(s[0])这样,特别是对结构体 ; 
        4 指向函数的指针,用于确定排序的顺序.
    注意:如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要
在第一个和第二个参数上进行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);
    */
    qsort(sz,n,sizeof(sz[0]),cmp);
    printf("\n按成绩升序为:\n\n");
    for(int i=0;i<n;i++){
        printf("%s %s %d %d\n",sz[i].name,sz[i].sex,sz[i].age,sz[i].score);
    }
}

[转自] (https://www.cnblogs.com/panweiwei/p/6481034.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值