题目
1004 成绩排名
分数 20
作者 CHEN, Yue
单位 浙江大学
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
代码长度限制16 KB
时间限制 400 ms
内存限制 64 MB
过程:
建立结构体
typedef struct Student //SIZE被宏定义为11。
{
char StudentName[SIZE]; //姓名
char StudentNumber[SIZE]; //学号
int StudentGread; //成绩
struct Student* next;//指针域
}student;
创建初始链表(只有一个头节点)
student* CreatLinkedlist()//创建一个初始链表(建立一个指针域为空的头节点)
{
student* star = (student*)malloc(sizeof(student));
star->next = NULL;
return star;
}
在头节点数据域我未放置任何数据,这是因为大多数链表头节点数据域存放的是链表本体数据(例如:一个节点所占的
内存大小、总节点数、已用节点数等)同时,头结点的指针域为空
在末节点插入节点(可以尝试在链表中间插入或删除节点,同时也可以尝试片节点的删除和插入)
student* LinkInster(student* star)//插入的同时输入数据
{
student* end;
end = (student*)malloc(sizeof(student));
scanf("%s", end->StudentName);
scanf("%s", end->StudentNumber);
scanf("%d", &end->StudentGread);
end->next = NULL;//末节点指针域为空
star->next = end;//前一个节点的指针域指向末节点
return end;
}
建立一个整体链表
student* InPut()
{
student* head = NULL;//创建头指针
head = CreatLinkedlist();//创建一个头指针指向头节点的初始链表(只有一个头指针和一个头节点)
student* save = head;//保存链表的起始位置
int num;
scanf("%d", &num);//输入想要插入数据的节点数
for (int i = 0; i < num; i++)
{
head = LinkInster(head);//head每次后移保证每次是插在末尾。
}
return save;
}
判断并打印节点数据
void PrintLink2(student* SaveAfter)
{
if (SaveAfter->next == NULL) return;//判断输入是否为零(学生个数)
else
{
int number = 0;
student* date = NULL, * DateAfter = NULL;//存放满足要求的数据的指针
student* SaveAgine = SaveAfter->next;
int NumberAgter = SaveAgine->StudentGread;
while (SaveAgine != NULL)
{
if (SaveAgine->StudentGread >= number) { date = SaveAgine; number = SaveAgine->StudentGread; }
if (SaveAgine->StudentGread <= NumberAgter) { NumberAgter = SaveAgine->StudentGread; DateAfter = SaveAgine; }//条件判断
SaveAgine = SaveAgine->next;
}
printf("%s %s\n", date->StudentName, date->StudentNumber);
printf("%s %s\n", DateAfter->StudentName, DateAfter->StudentNumber);
}
}
建立完整测试函数
void TestLinkList()
{
student* SaveAfter = InPut();
PrintLink2(SaveAfter);
}
完整代码如下
#include<stdio.h>
#include<stdlib.h>
#define SIZE 11
typedef struct Student //SIZE被宏定义为11。
{
char StudentName[SIZE]; //姓名
char StudentNumber[SIZE]; //学号
int StudentGread; //成绩
struct Student* next;//指针域
}student;
student* CreatLinkedlist();
student* LinkInster(student* star);
student* InPut();
void PrintLink2(student* SaveAfter);
void TestLinkList();
int main()
{
TestLinkList();
return 0;
}
student* CreatLinkedlist()//创建一个初始链表(建立一个指针域为空的头节点)
{
student* star = (student*)malloc(sizeof(student));
star->next = NULL;
return star;
}
student* LinkInster(student* star)//插入的同时输入数据
{
student* end;
end = (student*)malloc(sizeof(student));
scanf("%s", end->StudentName);
scanf("%s", end->StudentNumber);
scanf("%d", &end->StudentGread);
end->next = NULL;//末节点指针域为空
star->next = end;//前一个节点的指针域指向末节点
return end;
}
student* InPut()
{
student* head = NULL;//创建头指针
head = CreatLinkedlist();//创建一个头指针指向头节点的初始链表(只有一个头指针和一个头节点)
student* save = head;//保存链表的起始位置
int num;
scanf("%d", &num);//输入想要插入数据的节点数
for (int i = 0; i < num; i++)
{
head = LinkInster(head);//head每次后移保证每次是插在末尾。
}
return save;
}
void PrintLink2(student* SaveAfter)
{
if (SaveAfter->next == NULL) return;//判断输入是否为零(学生个数)
else
{
int number = 0;
student* date = NULL, * DateAfter = NULL;//存放满足要求的数据的指针
student* SaveAgine = SaveAfter->next;
int NumberAgter = SaveAgine->StudentGread;
while (SaveAgine != NULL)
{
if (SaveAgine->StudentGread >= number) { date = SaveAgine; number = SaveAgine->StudentGread; }
if (SaveAgine->StudentGread <= NumberAgter) { NumberAgter = SaveAgine->StudentGread; DateAfter = SaveAgine; }//条件判断
SaveAgine = SaveAgine->next;
}
printf("%s %s\n", date->StudentName, date->StudentNumber);
printf("%s %s\n", DateAfter->StudentName, DateAfter->StudentNumber);
}
}
void TestLinkList()
{
student* SaveAfter = InPut();
PrintLink2(SaveAfter);
}