之前遇到排序只会想到如冒泡,选择,快速排序等等,刚刚跟学到了用结构体的方法来排序,针对类似成绩排序题还行。

头文件:

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

定义结构体:

 typedef struct Stu{
char name[];
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));
/*返回值是0、1*/
if(strcmp(c.name,d.name)>){
return strcmp(c.name,d.name);
}
else{
if(strcmp(c.name,d.name)==){
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. 单个元素的大小,推荐使用sizeof(st[0])这样的表达式;
  4. 指向函数的指针,用于确定排序的顺序.

下面是一个成绩排序程序的代码:

代码一:非结构体排序方法:

 #include<stdio.h>
#include<string.h>
int main()
{
int n;
char name[];
char sex[];
char year[];
int score[]; int max = -;
int mix = ;
/*最高分者信息*/
char maxname[];
char maxsex[];
char maxyear[];
/*最低分者信息*/
char mixname[];
char mixsex[];
char mixyear[]; scanf("%d",&n);
for(int i=;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[];
char sex[];
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[];
scanf("%d",&n);
for(int i=;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[]),cmp);
printf("\n按成绩升序为:\n\n");
for(int i=;i<n;i++){
printf("%s %s %d %d\n",sz[i].name,sz[i].sex,sz[i].age,sz[i].score);
}
}

C语言 · 运用结构体的排序方法的更多相关文章

  1. C语言中结构体的访问方法解读

    在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...

  2. Go语言 6 结构体、方法和接口

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...

  3. go语言进阶之为结构体类型添加方法

    1.为结构体类型添加方法 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  4. Go语言之结构体与方法

    一.结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1.结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex st ...

  5. C语言的结构体和C++结构体的区别

    关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...

  6. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  7. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  8. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  9. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

随机推荐

  1. 设置sqlplus访问远程oracle数据库的最快方法

    设置sqlplus访问远程oracle数据库的最快方法 时间:2010-01-21 10:57来源: 作者: 点击: 2次 设置sqlplus访问远程oracle数据库的最快方法,如果要连接远程数据库 ...

  2. IDEA编辑区光标样式修改

    转自:http://blog.csdn.net/aosica321/article/details/52787418 Intellj IDEA光标为insert状态,无法删除内容以前用得是社区版的ID ...

  3. HDUOJ---------2255奔小康赚大钱

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. NYOJ-------三角形

    Problem A 三角形 时间限制:1000 ms  |  内存限制:65535 KB   描述 在数学中,如果知道了三个点的坐标,我们就可以判断这三个点能否组成一个三角形:如果可以组成三角形,那么 ...

  5. 【LeetCode】150. Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  6. 深入理解Java:自定义java注解

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  7. Python学习笔记015——序列(字节数组 bytearray)

    1 序列 常见的序列有:list   tuple  str  bytes(字节串)  bytearray 2 字节数组bytearray 可变的字节序列,相当于bytes的可变版本. 3 创建函数by ...

  8. HR面 - 十大经典提问

    1.HR:你希望通过这份工作获得什么? 1).自杀式回答:我希望自己为之工作的企业能够重视质量,而且会给做得好的员工予以奖励.我希望通过这份工作锻炼自己,提升自己的能力,能让公司更加重视我. a.“我 ...

  9. npm 模块化方式接入 font-awsome

    https://segmentfault.com/q/1010000009795785/a-1020000009796355 $ npm install font-awesome 在main.js里添 ...

  10. es6 generator 基础知识

    1.定义和使用 function *gen() { return 'first generator'; } // 有点类似类的实例化过程 let generatorResult = gen() // ...