C语言 · 运用结构体的排序方法
之前遇到排序只会想到如冒泡,选择,快速排序等等,刚刚跟学到了用结构体的方法来排序,针对类似成绩排序题还行。
头文件:
#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 * ));
参数列表:
- 待排序数组首地址;
- 数组中待排序元素数量;
- 单个元素的大小,推荐使用sizeof(st[0])这样的表达式;
- 指向函数的指针,用于确定排序的顺序.
下面是一个成绩排序程序的代码:
代码一:非结构体排序方法:
#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语言 · 运用结构体的排序方法的更多相关文章
- C语言中结构体的访问方法解读
在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- go语言进阶之为结构体类型添加方法
1.为结构体类型添加方法 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...
- Go语言之结构体与方法
一.结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1.结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex st ...
- C语言的结构体和C++结构体的区别
关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- go语言学习-结构体
结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...
- 将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. ...
随机推荐
- 通过shell定时备份数据库
需求: 每天凌晨2:10备份数据库zhengDB到 /data/backup/db. 备份开始和结束能够给出相应提示信息. 备份后的文件标识标准为已备份时间为文件名,并打包成 .tar.gz 的形式, ...
- HDUOJ----Good Luck in CET-4 Everybody!
Good Luck in CET-4 Everybody! Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (J ...
- 由ConcurrentLinkedQueue扯到线程安全 待整理
前几天项目总是报错,找了下原因. ConcurrentLinkedQueue 本身是一个基于链接节点的无界线程安全队列,你自己调用就不用考虑线程安全了吗? 结论是:原子性操作当然是线程安全的,非原子性 ...
- RabbitMQ消息队列名词解释[转]
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件 从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...
- Windows下面安装和配置Solr 4.9(二)
将Solr和Tomcat结合: 1.在D盘下创建目录 D:\Demos\Solr 2.解压solr-4.9.0文件,我这里下载的是这个4.9版本,将example文件夹下的solr文件夹中的所有文件( ...
- C# 默认参数/可选参数需要注意
在使用C#的默认参数/可选参数的时候,需要注意,参数的默认值是在编译的时候,自动加入调用方的. 如我有这样一个方法: public class Name { public void Test(Bool ...
- jquery 事件注冊 与反复事件处理
<!doctype html> <html lang="us"> <head> <meta charset="utf-8&quo ...
- Python isspace() 方法
描述 Python isspace() 方法检测字符串是否只由空格组成. 语法 isspace() 方法语法: S.isspace() 参数 无. 返回值 如果字符串中至少有一个字符,并且所有字符都是 ...
- 云从科技 OCR任务 pixel-anchor 方法
云从科技提出了一种端到端的深度学习文本检测框架Pixel-Anchor,通过特征共享的方式高效的把像素级别的图像语义分割和锚检测回归放入一个网络之中, 把像素分割结果转换为锚检测回归过程中的一种注意力 ...
- 2-String to Integer (atoi)
实现atoi这个函数, public int atoi(String str),传入字符串str可以返回整数,请仔细考虑一下字符串的各种情况! String to Integer: Case分析 正常 ...