利用顺序表和链表实现有若干学生数据(学生数小于50),每个学生数据包含学号(每个学生学号是唯一的,但学生记录不一定按学号顺序存放)、姓名、班号和若干门课程成绩(每个学生所选课程数目可能不等,但最多不超过6门)。 要求:设计一个程序输出每个学生的学号、姓名和平均分以及每门课程(课程编号从1~6)的平均分。
时间: 2023-05-29 20:06:43 浏览: 157
以下是基于顺序表和链表两种不同的实现方法:
1. 基于顺序表的实现:
定义一个结构体表示每个学生的数据:
```c
typedef struct {
int id; // 学号
char name[20]; // 姓名
int class_id; // 班号
int course_num; // 所选课程数
int scores[6]; // 成绩
} Student;
```
定义一个数组存储所有学生的数据:
```c
Student students[50];
int student_num = 0; // 学生数目
```
定义一个函数用于计算每个学生的平均分和每门课程的平均分:
```c
void calculate_average() {
for (int i = 0; i < student_num; i++) {
int sum = 0;
for (int j = 0; j < students[i].course_num; j++) {
sum += students[i].scores[j];
}
double avg = (double)sum / students[i].course_num;
printf("%d %s %.2lf ", students[i].id, students[i].name, avg);
for (int j = 1; j <= 6; j++) {
int count = 0;
int sum = 0;
for (int k = 0; k < student_num; k++) {
if (students[k].scores[j-1] >= 0) {
count++;
sum += students[k].scores[j-1];
}
}
double avg = (double)sum / count;
printf("%.2lf ", avg);
}
printf("\n");
}
}
```
2. 基于链表的实现:
定义一个结构体表示每个学生的数据:
```c
typedef struct _node {
int id; // 学号
char name[20]; // 姓名
int class_id; // 班号
int course_num; // 所选课程数
int scores[6]; // 成绩
struct _node *next; // 指向下一个节点的指针
} StudentNode;
```
定义一个链表的头指针:
```c
StudentNode *head = NULL;
```
定义一个函数用于计算每个学生的平均分和每门课程的平均分:
```c
void calculate_average() {
StudentNode *p = head;
while (p != NULL) {
int sum = 0;
for (int j = 0; j < p->course_num; j++) {
sum += p->scores[j];
}
double avg = (double)sum / p->course_num;
printf("%d %s %.2lf ", p->id, p->name, avg);
for (int j = 1; j <= 6; j++) {
int count = 0;
int sum = 0;
StudentNode *q = head;
while (q != NULL) {
if (q->scores[j-1] >= 0) {
count++;
sum += q->scores[j-1];
}
q = q->next;
}
double avg = (double)sum / count;
printf("%.2lf ", avg);
}
printf("\n");
p = p->next;
}
}
```
注意:基于链表的实现需要在添加每个学生的数据时,动态地分配内存并将新节点插入链表中。省略这部分代码,完整代码如下:
阅读全文