请教:结构体数组的元素可以排序吗?
请问可以将结构体数组的元素加以排序?例如,我想将学生信息按照期末考试卷面成绩进行排序。先定义以下结构体并声明该结构体的数组,
#include <stdio.h>
#define LEN 21
#define MAX 10
struct stu_info
{
char name[LEN];
float marks;
};
int main(void)
{
struct stu_info data[MAX];
int cnt = 0,i,j;
//假如学生的信息已经都输入好了,接下来应该如何根据学生的分数对数组元素进行从大到小的排序呢?
puts("\nInput students' names (press Enter at the beginning of a line to stop)");
while(cnt < MAX && gets(data[cnt].name) != NULL && data[cnt].name[0] != '\0')
{
printf("Enter students' marks: ");
scanf("%d", &data[i].marks);
cnt++;
}
// 请告知如何排序
// ......
//排序之后打印结果
if(cnt != 0)
{
puts("\nStudents' info in the order of their marks:");
for(i = 0; i < cnt; i++)
printf("%s: %d\n", data[i].name, data[i].marks);
}
else
puts("\nNo data input.");
puts("\nBye!");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//【样例输入】
//4
//3 22 21
//3 21 22
//3 22 22
//3 21 21
//【样例输出】
//3 21 21
//3 21 22
//3 22 21
//3 22 22
#define MAX_SIZE 1024
struct get_time{
int Hour;
int Minute;
int Second;
};
void deal(struct get_time *elem,int size)
{
struct get_time tmp;
int i, j;
for (i = 0; i < size; i++) {
for (j = size - 1; j > i; j--) {
if (elem[j].Hour < elem[j-1].Hour
[解决办法]
elem[j].Minute < elem[j-1].Minute
[解决办法]
elem[j].Second < elem[j-1].Second ) {
tmp = elem[j-1];
elem[j-1] = elem[j];
elem[j] = tmp;
}
}
}
}
int main()
{
struct get_time answer[MAX_SIZE];
int i;
int num;
scanf("%d",&num);
for(i = 0 ; i < num ; i++)
{
scanf("%d %d %d",&answer[i].Hour,&answer[i].Minute,&answer[i].Second);
}
printf("\n");
deal(answer,num);
for(i = 0 ; i < num ; i++)
printf("%d %d %d\n",answer[i].Hour,answer[i].Minute,answer[i].Second);
return 0;
}
int comparefloat(float a,float b)
{
if(a == b)return 0;
if(a > b )return 1;
return -1;
}
int cmpByPtr(const void* arg1,const void *arg2)
{
return comparefloat( (*( struct stu_info **)arg1)->marks,
(*( struct stu_info **)arg2)->marks);
}
// 比较指针
int main(){
struct stu_info *pInfo[MAX];
for(int i=0;i<MAX;i++)pInfo[i] =data +i;
........
qsort(pInfo,MAX,sizeof(struct stu_info *),cmpByPtr);
.......
for(i = 0; i < cnt; i++)
printf("%s: %d\n", pInfo[i]->name, pInfo[i]->marks);
rturn 0;
}
.....
int comparefloat(float a,float b)
{
if(a == b)return 0;
if(a > b )return 1;
return -1;
}
int cmpByData(const void* arg1,const void *arg2)
{
return comparefloat( (( struct stu_info *)arg1)->marks,
(( struct stu_info *)arg2))->marks );
}
// 比较数据
int main(){
........
qsort(data,MAX,sizeof(struct stu_info *),cmpByData);
.......
for(i = 0; i < cnt; i++)
printf("%s: %d\n", data[i]->name, data[i]->marks);
rturn 0;
}