简单举一个例子来介绍涉及结构体的排序问题。
例:输入若干学生姓名、语文成绩、数学成绩、英语成绩,根据三科成绩总分由高到低进行排序。
输入数据:
小明 78 89 90
小红 87 88 77
小华 91 92 96
输出样例:
小华 91 92 96 279
小明 78 89 90 257
小红 87 88 77 252
这个问题就需要用到结构体来存放各科成绩及其总分,然后根据总分进行排序。
输入学生的数量可以通过用户输入得到,然后根据用户输入的值动态分配内存空间,当然也可以不用这样,直接定义一个已知的结构体类型的数组。
本例的代码如下。
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char name[20];
int score_1;
int score_2;
int score_3;
int sum_score;
}Stu;
void input_info(Stu stu_stru[],int n)
{
for(int i=0;i<n;i++)
{
printf("学生%d姓名:",i+1);
scanf("%s", &stu_stru[i].name);
printf("语文成绩:");
scanf("%d", &stu_stru[i].score_1);
printf("数学成绩:");
scanf("%d", &stu_stru[i].score_2);
printf("英语成绩:");
scanf("%d", &stu_stru[i].score_3);
stu_stru[i].sum_score = stu_stru[i].score_1 + stu_stru[i].score_2 + stu_stru[i].score_3;
}
}
void print_info(Stu stu_stru[],int n)
{
printf("姓名 语文 数学 英语 总分\n");
for(int i=0;i<n;i++)
{
printf("%4s ",stu_stru[i].name);
printf("%4d ",stu_stru[i].score_1);
printf("%4d ",stu_stru[i].score_2);
printf("%4d ",stu_stru[i].score_3);
printf("%4d\n",stu_stru[i].sum_score);
}
}
void sort_score(Stu stu_stru[],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(stu_stru[j].sum_score < stu_stru[j+1].sum_score)
{
Stu temp;
temp = stu_stru[j];
stu_stru[j] = stu_stru[j+1];
stu_stru[j+1] = temp;
}
}
}
}
void main()
{
int n;
Stu *stu_info; //这里也可以直接定义为 Stu stu_info[50];
printf("输入学生数量:");
scanf("%d",&n);
stu_info = (Stu *)malloc(n*sizeof(Stu)); //动态分配内存
input_info(stu_info,n);
printf("\n输入序列:\n");
printf("----------------------------------\n");
print_info(stu_info,n);
sort_score(stu_info,n);
printf("----------------------------------\n");
printf("\n按总分排序后:\n");
printf("----------------------------------\n");
print_info(stu_info,n);
printf("----------------------------------\n");
free(stu_info);
}
上面的代码在函数中是以结构体数组直接访问各成员的,下面的代码通过指针来访问结构体中的各成员。
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char name[20];
int score_1;
int score_2;
int score_3;
int sum_score;
}Stu;
void input_info(Stu *p,int n)
{
for(int i=0;i<n;i++)
{
printf("学生%d姓名:",i+1);
scanf("%s", &(p+i)->name);
printf("语文成绩:");
scanf("%d", &(p+i)->score_1);
printf("数学成绩:");
scanf("%d", &(p+i)->score_2);
printf("英语成绩:");
scanf("%d", &(p+i)->score_3);
(p+i)->sum_score = (p+i)->score_1 + (p+i)->score_2 + (p+i)->score_3;
}
}
void print_info(Stu *p,int n)
{
printf("姓名 语文 数学 英语 总分\n");
for(int i=0;i<n;i++)
{
printf("%4s ",(p+i)->name);
printf("%4d ",(p+i)->score_1);
printf("%4d ",(p+i)->score_2);
printf("%4d ",(p+i)->score_3);
printf("%4d\n",(p+i)->sum_score);
}
}
void sort_score(Stu *p,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if((p+j)->sum_score < (p+j+1)->sum_score)
{
Stu temp;
temp = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = temp;
}
}
}
}
void main()
{
int n;
Stu *stu_info;
printf("输入学生数量:");
scanf("%d",&n);
stu_info = (Stu *)malloc(n*sizeof(Stu));
input_info(stu_info,n);
printf("\n输入序列:\n");
printf("----------------------------------\n");
print_info(stu_info,n);
sort_score(stu_info,n);
printf("----------------------------------\n");
printf("\n按总分排序后:\n");
printf("----------------------------------\n");
print_info(stu_info,n);
printf("----------------------------------\n");
free(stu_info);
}
程序运行后输入及输出结果如下图所示。
上面的输出结果是根据总分由高到低排列的,符合题目要求。