结构体及结构体排序

自己理解的,结构体是一种可以自己定义一个新的“型”的神奇的东西,而它的特征就是里面可以放上各种奇奇怪怪的东西(就是各种各样的型,比如int,float,char啥的),让它们联系起来。。。
emmm,其实这玩意的定义感觉没啥用,直接上代码吧,想看定义可以自行百度百科,嘿嘿。。。。QwQ

1.结构体的格式

<1>定义的方法
struct node //   用strut定义一个结构体,node是结构体的名字,可以自己瞎取。
{
    int a;  // 放入一个int型a,
    float b;  //一个float型b,
    char c;       //后面不说了,反正知道是这样就行了。。。     
    double d;
    long f;       
    long long e;
}p[1000];    //这样你就定义了一个神奇的数组!!没错,它就是node型数组!!

上面的代码还在结构体的末尾定义了一个该型的数组,其实这个数组不一定要有,而且也可以在主函数中定义,但是感觉上用的比较多,而且这样定义比在主函数中定义整洁。。。。。大概就是这样吧,反正用不用都可以就对了。
除此之外,结构体中也可以放入数组,string之类的东西。

<2>一些奇奇怪怪的操作

通常为了方便理解,我们会把定义结构体命名成你原本想表达的意思,但这有时会让你定义的结构体名字很长。比如:你要在结构体里存储一个班级所有学生的姓名和成绩,你就可以把结构体命名为student,但是你觉得后面用到结构体时输student很麻烦,于是你想把它简化成stu,你可以通过以下代码实现

typedef struct student //用typedef来建立一个结构体。
{
  int gread;
  char name[100];  
}stu;       //可以在这里给你的结构体改名。

这个代码里用到了typedef,如果用到了这个。。。“东西”(我也不知道该把它叫啥),其实你也可以不在struct后给结构体命名,你可以像这样

typedef struct  
{
  int gread;
  char name[100];  
}student;  //直接在末尾命名。

然鹅,其实我自己很少用上面的东西,因为在最后放了这个名字后,好似就不能同时也在最后定义一个该型的数组了,但是结构体的数组感觉上是经常要用的。
当然有可能是应为我自己的操作不对,但是百度了这么久的确没找到什么好的解决方法,所以我一般直接这样改名

struct student
{
	int gread;
	char name[100];
}p[100];

typedef student stu; //像这样改名也是可以的。

emmm,就这么多吧,结构体真没啥好说的。

2.结构体排序

其实就是要用bool型重新写个函数(一般叫cmp),来明确排序规则,然后想都别想用sort就好了,嘿嘿QwQ
这个写个例题,自己体会好了,感觉上没啥好讲的。。。

例题

一个班级有n个学生,输入这n个学生的姓名,分数,按分数降序排序,若分数相同,则按出现顺序升序排序,输出排序后的学生姓名。

#include<bits/stdc++.h>
using namespace std;   

struct student  //定义结构体。
{
	int great, i;
	char name[100];
}p[1000];

typedef student stu;  //改名。

bool cmp(stu x, stu y)   //定义sort的方法。
{
	if(x.gread != y.gread)
		return x.gread > y.gread;
	else
		return x.i < y.i;
}

int main()
{
	int n;
	cin >> n;
	for(int i = 0; i < n; i ++)
	{
		cin >> p[i].name >> p[i].gread;
		p[i].i = i;
	}
	sort(p, p + n, cmp);
	for(int i = 0; i < n; i ++)
	{
		cout << p[i].name << endl;
	}
	return 0;
}

这应该是有关结构体排序最简单的一种题目,难的题目会在定义sort方式时给出很多很多的逻辑问题,也是在做此类题目时,最容易出错,最需要注意的一点(至少我是常在这出错。。。)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值