自己理解的,结构体是一种可以自己定义一个新的“型”的神奇的东西,而它的特征就是里面可以放上各种奇奇怪怪的东西(就是各种各样的型,比如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方式时给出很多很多的逻辑问题,也是在做此类题目时,最容易出错,最需要注意的一点(至少我是常在这出错。。。)