用尾插法创建一个带头结点的单链表,单链表的结点结构包括:学生学号、课程成绩及指向下一个结点的指针。利用单链表实现统计一个班学生的某门课程的平均分,并显示此门课程的平均分。要求:用VC++6.0,写出头文件,写出完整代码
时间: 2024-10-08 11:01:14 浏览: 40
用前插法建立带头结点的单链表-《数据结构》课件
在VC++6.0中,我们可以创建一个名为`StudentNode.h`的头文件,用于定义单链表节点结构以及相关的函数,然后编写`ListManager.cpp`来实现链表操作和平均分数计算。以下是头文件`StudentNode.h`的示例:
```cpp
// StudentNode.h
#ifndef STUDENTNODE_H
#define STUDENTNODE_H
#include <iostream>
using namespace std;
struct StudentNode {
int studentID;
double courseScore;
StudentNode* next; // 指向下一个节点
// 构造函数
StudentNode(int id = 0, double score = 0) : studentID(id), courseScore(score), next(nullptr) {}
// 计算当前节点分数
double calculateAverage() {
return courseScore;
}
};
#endif // STUDENTNODE_H
```
接着,在`ListManager.cpp`中实现链表管理和平均分计算的功能:
```cpp
// ListManager.cpp
#include "StudentNode.h"
#include <vector>
class ListManager {
private:
vector<StudentNode*> students; // 存储所有节点
public:
// 添加新节点到链表
void addStudent(int id, double score) {
StudentNode* newNode = new StudentNode(id, score);
if (students.empty()) {
students.push_back(newNode);
} else {
students.back()->next = newNode;
students.push_back(newNode);
}
}
// 统计并打印特定课程的平均分
void printCourseAverage(int courseId) {
double sum = 0.0, count = 0;
for (const auto& node : students) {
if (node->courseScore == courseId) {
sum += node->calculateAverage();
count++;
}
}
double average = count > 0 ? sum / count : 0;
cout << "课程 " << courseId << " 的平均分为: " << average << endl;
}
};
int main() {
ListManager listManager;
// 示例添加学生和分数
listManager.addStudent(1, 85);
listManager.addStudent(2, 90);
listManager.addStudent(1, 92); // 同一学生有不同的课程分数
// 打印课程平均分
listManager.printCourseAverage(85); // 假设我们要查询85分课程的平均分
return 0;
}
```
在这个例子中,我们首先定义了一个链表节点结构`StudentNode`,然后创建了`ListManager`类管理整个列表。通过添加学生和课程成绩,可以方便地计算指定课程的平均分。
阅读全文