用尾插法创建一个带头结点的单链表,单链表的结点结构包括:学生学号、课程成绩及指向下一个结点的指针。利用单链表实现统计一个班学生的某门课程的平均分,并显示此门课程的平均分。 用Visual C++6.0写,包含头文件,写出完整可运行代码,不用位运算符
时间: 2024-10-08 08:03:17 浏览: 51
用前插法建立带头结点的单链表-《数据结构》课件
在C++中,我们可以使用尾插法创建一个带头结点的单链表,并实现统计某个班级某个课程的平均分。这里是一个简单的示例,首先我们定义链表节点结构体`StudentNode`,然后构造链表并计算平均分:
```cpp
// 定义链表节点结构
struct StudentNode {
int studentID;
float grade;
StudentNode* next;
};
class LinkedList {
private:
StudentNode* head;
public:
// 构造函数
LinkedList() : head(nullptr) {}
// 插入新节点到链表尾部
void insert(int id, float grade) {
if (head == nullptr) {
head = new StudentNode{id, grade, nullptr};
return;
}
StudentNode* current = head;
while (current->next != nullptr) {
current = current->next;
}
current->next = new StudentNode{id, grade, nullptr};
}
// 计算指定课程的平均分
double calculateAverageGrade(int courseId) const {
if (head == nullptr) return 0.0;
int totalGrades = 0;
int count = 0;
StudentNode* current = head;
while (current != nullptr) {
if (current->grade != -1) { // 假设未选修的课程标记为-1
if (current->courseID == courseId) {
totalGrades += current->grade;
count++;
}
}
current = current->next;
}
if (count == 0) return 0.0; // 如果没有选修该课程的学生,则返回0.0
return static_cast<double>(totalGrades) / count;
}
// 主函数演示如何使用
int main() {
LinkedList list;
// 插入数据,假设已知数据
list.insert(1001, 85);
list.insert(1002, 90);
list.insert(1003, -1); // 代表未选修
list.insert(1004, 78);
list.insert(1005, 92);
int courseToFind = 85; // 指定要查找的课程ID
double average = list.calculateAverageGrade(courseToFind);
std::cout << "课程 " << courseToFind << " 的平均分是:" << average << std::endl;
return 0;
}
};
int main() {
// 实例化链表并调用功能
return LinkedList().main();
}
```
这个程序定义了一个链表,并提供插入操作以及计算特定课程平均分的功能。在`main()`函数中,你可以根据实际需要添加学生数据。注意,为了简化代码,这里假设可以通过字段直接访问课程ID,实际情况中可能需要一个关联数组或其他数据结构来存储每个节点对应的课程信息。
阅读全文