用Visual C++6.0写,包含头文件,写出完整可运行代码,不用位运算符。用尾插法创建一个带头结点的单链表,单链表的结点结构包括:学生学号、课程成绩及指向下一个结点的指针。利用单链表实现统计一个班学生的某门课程的平均分,并显示此门课程的平均分。
时间: 2024-10-08 13:03:16 浏览: 47
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构
struct Student {
int studentID;
double courseScore;
struct Student* next;
};
// 尾插法添加节点到链表
void insertAtTail(Student** head, int id, double score) {
if (*head == nullptr) {
*head = new Student{ id, score, nullptr };
} else {
Student* current = *head;
while (current->next != nullptr) {
current = current->next;
}
current->next = new Student{ id, score, nullptr };
}
}
// 统计并显示某门课程的平均分
double calculateAverage(struct Student* head, int targetCourseID) {
double sum = 0;
int count = 0;
for (Student* node = head; node != nullptr; node = node->next) {
if (node->courseScore > 0 && node->studentID == targetCourseID) {
sum += node->courseScore;
count++;
}
}
return count > 0 ? sum / count : 0; // 如果有数据则计算平均分,否则返回0
}
int main() {
Student* listHead = nullptr;
// 添加示例学生数据
insertAtTail(&listHead, 1001, 85);
insertAtTail(&listHead, 1002, 90);
insertAtTail(&listHead, 1003, 78);
insertAtTail(&listHead, 1004, 88); // 添加一门特定课程的成绩
int targetCourseID = 1004; // 示例指定课程ID
double averageScore = calculateAverage(listHead, targetCourseID);
cout << "课程 " << targetCourseID << " 的平均分为: " << averageScore << endl;
// 清理内存
while (listHead != nullptr) {
Student* temp = listHead;
listHead = listHead->next;
delete temp;
}
return 0;
}
```
上述代码首先定义了一个`Student`结构体表示链表节点,包含了学号、课程分数以及指向下一个节点的指针。然后实现了尾插法创建链表,并提供了一个函数`calculateAverage`用于计算给定课程的平均分。在`main`函数中创建了一个简单的链表实例,并演示了如何使用这个函数。
注意:这个程序假设所有课程成绩都是正数,如果是实际应用,可能需要对负分或缺失值做特殊处理。
阅读全文