写一子函数,实现动态建立链表,输入3个同学的信息:学号,姓名,成绩
写一子函数,以上述链表作为实参,要求实现按照平均成绩从高到低输出3位同学的所有信息,并返回成绩最低的同学信息指针在主函数中使用函数指针实现子函数的调用,并输出“成绩最低的学生学号”。
#include <iostream>
#include <string>
#include <map>
using namespace std;
//学生信息
struct Student
{
string number;
string name;
float score;
};
//链表节点
struct Node
{
Student data;
Node* prev = nullptr;
Node* next = nullptr;
};
//链表末端添加一个学生
void add(Node* root, string num, string name, float score) {
Node* lastNode = root;
//查找最后一个node
while (lastNode->next){
lastNode = lastNode->next;
}
//创建
Node* node = new Node;
node->data.number = num;
node->data.name = name;
node->data.score = score;
node->prev = lastNode;
lastNode->next = node;
}
//输入count个学生的信息
void input(Node* root, int count)
{
int n = count;
while (n--){
string num, name;
float score = 0.0;
cout << "输入学生的学号:";
cin >> num;
cout << "输入学生的姓名:";
cin >> name;
cout << "输入学生的成绩:";
cin >> score;
add(root, num, name, score);
}
}
//打印学生信息
void print(const Student* data)
{
cout << "学号:" << data->number << "姓名:" << data->name << "成绩:" << data->score << endl;
}
//排序
Student* sort(Node* root)
{
//使用multimap结构自动进行排序(从小到大)
multimap<float, Student*> students;
Node* node = root->next;
while (node){
students.insert({node->data.score, &node->data});
node = node->next;
}
//因为是从小到大排序,需要反向遍历
for (auto iter = students.rbegin(); iter != students.rend(); ++iter)
{
print(iter->second);
}
//第一个元素即成绩最低的学生
return students.begin()->second;
}
int main()
{
Node root;
int n = 0;
cout << "学生数量:";
cin >> n;
//定义input函数的函数指针,并赋值
void (*input_ptr)(Node*, int) = input;
//调用
input_ptr(&root, n);
//定义函数的函数指针,并赋值
Student* (*sort_ptr)(Node * root) = sort;
//调用
Student* minStudent = sort_ptr(&root);
//
cout << "成绩最低的学生的学号:" << minStudent->number;
//wait
cin >> n;
return 0;
}