假如有一群人的“身高”和“姓名”,需要按照“身高”排序
在不使用结构体的情况下:我们自然而然想到使用数组进行分别存储“身高”和“姓名”,然后进行sort排序。 代码如下:
#include<stdio.h>
#include<ctype.h>
#define NUM 4 //学生人数
#define NAME_LEN 64//名字最大字符数
void swap_highth(int* num1, int* num2)
{
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
void swap_str(char* a, char* b)
{
char tmp[NAME_LEN] = { 0 };
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
}
void sort(char name[][NAME_LEN], int highth[])
{
int i = 0, j = 0;
for (i = 0; i < NUM-1; i++)
{
for (j = 0; j <NUM-1-i; j++)
{
if (highth[j-1] > highth[j])
{
swap_highth(&highth[j-1], &highth[j ]);
swap_str(name[j-1], name[j ]);
}
}
}
}
int main()
{
char name[][NAME_LEN] = {"liming" ,"zhangsan", "lisi" , "wangwu"};
int highth[] = {170,175,168,180};
for (int i = 0; i < NUM; i++)
{
printf("%s: %d \n", name[i], highth[i]);
}
sort(name, highth);
puts("按身高排序:\n");
for (int i = 0; i < NUM; i++)
{
printf("%s: %d \n", name[i], highth[i]);
}
return 0;
}
肉眼可见的非常复杂,不仅要按”身高“进行排序还要将对应的”姓名“也进行排序,如果再增加“奖学金”,“成绩”等数据之后将更复杂。那么有没有其他解决办法呢。
这时结构体应运而生,结构体是用来储存不同类型的集合,就像名片一样,展示一个人的不同信息。而上面提到的排序问题就可以通过结构体来进行解决,现在让我们开始学习结果体。
结构体的声明:
通过这样的声明就可以创建结构体变量,而这个结构体的类型是“struct student”。(如果我们不输入“student”,就会产生匿名结构体,匿名结构体只能使用一次。) 这样我们就建立了“名片”
下一步便是进行数据的输入。
我们依次输入对应数据即可。 然后我们看如何访问结构体数据
结构成员访问操作符有两个⼀个是“ . ” ,⼀个是 “-> ”. 它们的使用分别是: 结构体变量 . 成员变量名 结构体指针 —> 成员变量名
一般引用结构体数据使用“.”,输入结构体数据使用“—>”。 一定注意使用的数据类型。
在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?比如:
这样是一个正确的自引用方式,即产生链表的节点。 当然在自引用中不可以使用匿名结构体。
这是结构体最难的一部分知识 对齐规则:
这是其在内存中的空间。
这个比较特别,没有造成浪费空间。 下面再看一个例子:
这是其在内存中的空间。
发现其中有浪费空间,这是为什么?
尽量让占⽤空间⼩的成员尽量集中在⼀起(根据对齐规则不难发现这个道理)
回到开头的问题,用结构体是不是可以更方便解决问题了呢。
#include<stdio.h>
#define NUM 4
#define NAME_LEN 64
struct stu
{
char name[NAME_LEN];
int highth;
int score;
};
void swap(struct stu* num1, struct stu* num2)
{
struct stu tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
void sort(struct stu arr[], int n)
{
int i = 0, j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j - 1].highth > arr[j].highth)
{
swap(&arr[j - 1], &arr[j]);
}
}
}
}
int main()
{
struct stu arr[] = {
{"liming",170,50},
{ "zhansan",175,60 },
{ "lisi",168,100 },
{ "wangwu",180,80 }
};
int i = 0;
for (i = 0; i < NUM; i++)
{
printf("%s: %d ___%d\n", arr[i].name,arr[i].highth,arr[i].score);
}
sort(arr, NUM);
puts("按身高排序后\n");
for (i = 0; i < NUM; i++)
{
printf("%s: %d ___%d\n", arr[i].name, arr[i].highth, arr[i].score);
}
return 0;
}
可以看见,无论结构体中有多少变量,只需要一次交换即可,提高效率。