根据以下实验内容编写一个有顺序列表和链表结构体的c语言程序 (1)一个班上有30名学生,每个学生的数据作为一个记录,每个记录包括学号、姓名、三门课程的成绩和三门课程平均成绩。从键盘输入学生的学号、姓名及三门课。 (2)将程序改为使用链表实现。
时间: 2024-10-13 11:19:02 浏览: 35
首先,我们来看一下顺序列表版本的C语言程序:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 30
#define ID_LENGTH 10
#define NAME_LENGTH 10
#define C_NUM_COURSES 3
typedef struct {
char id[ID_LENGTH];
char name[NAME_LENGTH];
float scores[C_NUM_COURSES];
float avg_score;
} StudentRecord, *StudentRecordPtr;
void input_student(StudentRecordPtr student) {
scanf("%s %s", student->id, student->name);
for (int i = 0; i < C_NUM_COURSES; i++) {
scanf("%f", &student->scores[i]);
// 计算平均成绩
student->avg_score += student->scores[i];
}
student->avg_score /= C_NUM_COURSES;
}
int main() {
StudentRecord student[MAX_STUDENTS];
int num_students;
printf("请输入班级总人数:\n");
scanf("%d", &num_students);
if (num_students > MAX_STUDENTS) {
printf("学生数量超过最大限制 (%d),请重新输入。\n", MAX_STUDENTS);
return 1;
}
for (int i = 0; i < num_students; i++) {
input_student(&student[i]);
printf("学生%d信息:\n", i + 1);
printf("学号:%s 姓名:%s 平均成绩:%.2f\n", student[i].id, student[i].name, student[i].avg_score);
}
return 0;
}
```
接下来是链表版本的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char id[10];
char name[10];
float scores[3];
float avg_score;
struct Node *next;
} Node, *ListNode;
void input_student(ListNode *node) {
scanf("%s %s", node->id, node->name);
for (int i = 0; i < 3; i++) {
scanf("%f", &node->scores[i]);
node->avg_score += node->scores[i];
}
node->avg_score /= 3;
}
void insert_student(ListNode **head, ListNode *newNode) {
newNode->next = *head;
*head = newNode;
}
void print_list(ListNode *head) {
ListNode *current = head;
while (current != NULL) {
printf("学号:%s 姓名:%s 平均成绩:%.2f\n", current->id, current->name, current->avg_score);
current = current->next;
}
}
int main() {
ListNode *head = NULL;
int num_students;
printf("请输入班级总人数:\n");
scanf("%d", &num_students);
for (int i = 0; i < num_students; i++) {
ListNode *newNode = (ListNode*) malloc(sizeof(Node));
input_student(newNode);
insert_student(&head, newNode);
}
print_list(head);
free(head); // 程序结束后记得释放链表内存
return 0;
}
```
在链表版本中,我们使用`ListNode`结构体表示单个节点,通过插入函数`insert_student()`将新学生加入链表,并在主函数结束前释放内存。
阅读全文