7-9 链表也简单final
分数 10
全屏浏览
切换布局
作者 east
单位 福州大学
将学生成绩绩点组成一个链表。链表结构如下:
struct student {
string name; //学生姓名
double gpa; //绩点
student *next;
};
输入是一组学生的姓名和绩点,以链表形式存储。 删除绩点小于平均绩点的学生结点,成为一个新链表。 后按照输入的顺序,依序输出新链表的学生信息。平均绩点是输入的所有学生绩点取算术平均值。
输入格式:
输入包括若干行。 每行是一个学生的 姓名和绩点,以空格隔开。
最后一行是-1。
输出格式:
输出包括学生姓名。 每个学生姓名一行。
输入样例:
zhang 3.5
liu 2.1
tie 1.9
-1
输出样例:
zhang
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
#include<string>
using namespace std;
struct ListNode {
string name;
double gpa;
ListNode* next;
ListNode(string x, double y) :
name(x), gpa(y), next(nullptr) {}
};
class LinkedList {
public:
ListNode* head;//创建头指针
LinkedList() {
head = nullptr;
}
//输入框框
void append(string name, double gpa) {
ListNode* newNode = new ListNode(name, gpa);
if (!head) {
head = newNode;
return;
}
ListNode* current = head;
while (current->next) {
current = current->next;
}
current->next = newNode;
}
//输入链表
void input() {
string name;
double gpa;
while (cin >> name && name != "-1") {
cin >> gpa;
append(name, gpa);
}
}
double aver() {
ListNode* current = head;
double sum = 0, cnt = 0;
while (current) {
sum += current->gpa;
cnt++;
current = current->next;
}
return sum / cnt;
}
void deleteNode(ListNode*& head, double gpa) {
if (!head) {
return;
}
if (head->gpa == gpa) {
ListNode* temp = head;
head = head->next;
delete temp;
return;
}
ListNode* current = head;
while (current->next) {
if (current->gpa == gpa) {
ListNode* temp = current->next;
current->next = current->next->next;
delete temp;
return;
}
current = current->next;
}
}
void deletelow(double ave) {
while (head && head->gpa < ave) {
deleteNode(head, head->gpa);
}
ListNode* current = head;
while (current && current->next) {
if (current->next->gpa < ave) {
deleteNode(current->next, current->next->gpa);
}
else {
current = current->next;
}
}
}
void print() {
ListNode* current = head;
while (current) {
cout << current->name << endl;
current = current->next;
}
}
};
int main() {
LinkedList list;
list.input();
list.deletelow(list.aver());
list.print();
return 0;
}