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

头文件:

#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. js insertBefore

    <select id="city" size="4" style="width:50px"> <option id=&qu ...

  2. 理解ROC和AUC

    分类器各种各样,如何评价这些分类器的性能呢?(这里只考虑二元分类器,分类器的输出为概率值) 方法一:概率定义法 从正样本中随机选取元素记为x,从负样本中随机选取元素记为y,x的置信度大于y的概率 计算 ...

  3. SELECT控件add方法 ie 类型不匹配

    s = document.createElement('select'); try{ //for ie8 or earlier s.add(new Option('text','value'),s.o ...

  4. 原生js,插入元素

    function insert(){ var tarDiv = document.getElementById("aId"); var newDiv = document.crea ...

  5. Python cos() 函数

    描述 cos() 返回x的弧度的余弦值. 语法 以下是 cos() 方法的语法: import math math.cos(x) 注意:cos()是不能直接访问的,需要导入 math 模块,然后通过 ...

  6. 如何用Latex合并多个pdf文件?

    如何用Latex合并多个pdf文件?   用TeX合并pdf, 用LaTeX合并pdf 代码: \documentclass[a4paper]{article} \usepackage{pdfpage ...

  7. How to kill a process on a port on linux 怎么杀死 关掉一个端口

    sudo kill `sudo lsof -t -i:9001`

  8. Android开发6——布局中的wrap_content和fill_parent以及match_parent

    一.言简意赅 fill_parent 是让控件宽或者高占全屏 wrap_content是让控件的高或宽仅仅把控件里的内容包裹住而不是全屏 二.分别来看  1 fill_parent 设置一个构件的布局 ...

  9. .net程序调试一:快速定位异常

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  10. 创建Hive/hbase相关联的表异常

    hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive ...