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

头文件:

#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. 很轻很强大:轻量级桌面环境比较(转自linuxeden)

    这天你终于下定决心购买了一台流行的 Netbook ,与往常装机一样,直接安装心爱的 Linux 发行版.好不容易安装完成了,却发现平日启动飞快的应用程序在 Netbook 上怎么都跑不快.怎么办呢? ...

  2. cxf之生成客户端代码

    wsdl2java –d . http://192.168.1.100:1234/weather?wsdl

  3. VMware workstation 与 VMware GSX Server 的区别

    http://xsagaplus.iteye.com/blog/358917VMware是提供一套虚拟机解决方案的软件,主要产品分为如下三个. VMware-ESX-Server  这个版本并不需要操 ...

  4. android 手机红外遥控器实现

    经过连续几天的编制,安卓手机代码终于完成了,目前已经将我宿舍,家里,集控室的红外遥控电气设备完好的遥控了,另外还遥控了我的D7000相机,不错终于完工了.代码分为二类:各种电视.相机.等等遥控编码最简 ...

  5. Quartz2之入门示例

    环境:XP+Myeclipse6.5+JDK1.6 quartz官网:http://www.quartz-scheduler.org/ 参考资料 1 Quartz任务调度快速入门 http://www ...

  6. RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    1.topic类型的Exchange 我们之前说过Topic类型的Exchange是direct类型的模糊查询模式,可以通过routkey来实现模糊消费message,topic的模糊匹配有两种模式: ...

  7. C#开发Windows Services服务--服务安装失败的解决办法

    问题1:“System.Security.SecurityException:未找到源,但未能搜索某些或全部事件日志.不可访问的日志: Security.” 正在运行事务处理安装. 正在开始安装的“安 ...

  8. Workflow_工作流的基本概念(概念)

    2014-06-01 Created By BaoXinjian

  9. 在为shader program pass uniform之前一定要先use program。

    在为shader program pass uniform之前一定要先use program.

  10. jQuery attr方法修改onclick值

    了通过jQuery的attr修改onclick值. 代码: var js = "alert('B:' + this.id); return false;"; var newclic ...