在上一题基础上,增加struct Student* next成员。并以新的学生结构体struct Student类型为结点,使用malloc函数动态建立单链表。程序结束前使用free函数释放单链表所有结点。在
时间: 2024-03-29 22:38:14 浏览: 50
好的,下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char id[10]; // 学号
char Name[20]; // 姓名
double Score[3]; // 3门课程成绩
struct Student* next; // 指向下一个结点的指针
};
int main() {
struct Student* head = NULL; // 定义头结点指针
struct Student* tail = NULL; // 定义尾结点指针
struct Student* p = NULL; // 定义当前结点指针
int n; // 学生数量
// 输入学生数量
printf("请输入学生数量:");
scanf("%d", &n);
// 动态建立单链表
for (int i = 0; i < n; i++) {
p = (struct Student*)malloc(sizeof(struct Student)); // 申请结点内存
printf("请输入第%d个学生的信息:\n", i+1);
printf("学号:");
scanf("%s", p->id);
printf("姓名:");
scanf("%s", p->Name);
printf("3门课程成绩:");
for (int j = 0; j < 3; j++) {
scanf("%lf", &p->Score[j]);
}
p->next = NULL; // 新结点指针域置为NULL
if (head == NULL) { // 第一个结点作为头结点
head = p;
tail = p;
} else { // 非第一个结点,插入尾部
tail->next = p;
tail = p;
}
}
// 显示数据
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
p = head;
while (p != NULL) {
printf("%s\t%s\t%.1f\t%.1f\t%.1f\n", p->id, p->Name, p->Score[0], p->Score[1], p->Score[2]);
p = p->next;
}
// 释放单链表所有结点
p = head;
while (p != NULL) {
head = p->next;
free(p);
p = head;
}
return 0;
}
```
输入示例:
```
请输入学生数量:3
请输入第1个学生的信息:
学号:2021001
姓名:张三
3门课程成绩:80.5 85.0 92.5
请输入第2个学生的信息:
学号:2021002
姓名:李四
3门课程成绩:90.5 85.0 92.5
请输入第3个学生的信息:
学号:2021003
姓名:王五
3门课程成绩:85.0 90.0 89.5
```
输出示例:
```
学号 姓名 成绩1 成绩2 成绩3
2021001 张三 80.5 85.0 92.5
2021002 李四 90.5 85.0 92.5
2021003 王五 85.0 90.0 89.5
```
阅读全文