解题思路:

一开始我的思路是此题结构体大小应该根据每次输入的n值来分配,但是分配内存时没有考虑到连续性,不能使用qsort来排序,需要自己编写排序函数。

于是嫌麻烦偷懒,先建立大小为1000的结构体数组,保证不会超出,然后利用qsort函数来排序。

最后又写了一个分配连续内存的结构体数组进行qsort,两全其美(参考代码2)。


注意事项:

坑1:用malloc务必保证连续性,一次分配完所需大小,否则不能qsort,得自己写排序算法。如果用指针数组循环分配单个结构体大小会吃这个亏。

坑2:样例只给了一组数据输入输出,但实际上题意是多组数据输入输出,需要while循环scanf至EOF。

坑3:题目说按成绩排序,相同再按名字,但仅仅做到这样还是WA,还得拓展思考——名字也相同,按年龄来排序。

参考代码1(不使用动态内存分配):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	char name[101];
	int age;
	int mark;
}stu;

int cmp(const void * e1, const void* e2)
{
	if (((stu*)e1)->mark != ((stu*)e2)->mark)//成绩不同优先判断成绩
		return ((stu*)e1)->mark - ((stu*)e2)->mark;
	if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))//成绩相同,判断名字
		return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
	return ((stu*)e1)->age - ((stu*)e2)->age;//名字也相同,再根据年龄判断
}

int main()
{
	int n = 0,i = 0;
	stu group[1000];
	while (scanf("%d", &n) != EOF)//注意多组输入
	{
		for (i = 0;i < n;i++)
		{
			scanf("%s %d %d", group[i].name, &group[i].age, &group[i].mark);//循环录入每组数据
		}
		qsort(group, n, sizeof(stu), cmp);//快速排序
		for (i = 0;i < n;i++)
		{
			printf("%s %d %d\n", group[i].name, group[i].age, group[i].mark);//输出排序后的结果
		}
	}
	return 0;
}

参考代码2(优化版,动态内存分配,结构体数组在内存连续以进行qsort):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	char name[101];
	int age;
	int mark;
}stu;


int cmp(const void * e1, const void* e2)
{
	if (((stu*)e1)->mark != ((stu*)e2)->mark)
		return ((stu*)e1)->mark - ((stu*)e2)->mark;
	if (strcmp(((stu*)e1)->name, ((stu*)e2)->name))
		return strcmp(((stu*)e1)->name, ((stu*)e2)->name);
	return ((stu*)e1)->age - ((stu*)e2)->age;
}

int main()
{

	int n = 0, i = 0;

	while (scanf("%d", &n) != EOF)
	{
		stu* p = (stu*)malloc(sizeof(stu)*n);//一次分配好空间,保证连续性
		for (i = 0;i < n;i++)
		{
			scanf("%s %d %d", (p[i].name), &(p[i].age), &(p[i].mark));
			
		}
		qsort(p, n, sizeof(stu), cmp);
		for (i = 0;i < n;i++)
		{
			printf("%s %d %d\n", (p[i].name), (p[i].age), (p[i].mark));
		}
		free(p);//每当一组输入输出结束,将p释放掉。
	}
	return 0;
}


点赞(0)
 

0.0分

11 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

一抹柔情 3年前 回复TA
第二个,思路懂了,可惜我不会代码实现