请结合数据结构实现简单的学生信息管理,包括学生姓名,学号后四位,年龄,性别,三门课成绩,录入学生信息时能够不按照任何顺序进行录入,能够支持后续任意时刻的信息录入。成绩的录入要求能够按照学号顺序进行批量录入,并在录入时打印学生信息。要求按照链式结构实现的c语言代码实现
时间: 2024-11-09 21:30:23 浏览: 6
为了实现这个需求,我们可以使用链表数据结构来存储学生信息,因为链表可以动态添加元素且不需要事先规定插入位置。这里是一个简单的C语言链表结构和功能实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Student {
char name[50];
int id;
int age;
char gender[10];
float score[3]; // 三门课的成绩
struct Student *next; // 链接下一个节点
} StudentNode;
// 动态创建并初始化学生节点
StudentNode* createStudent(char* name, int id, int age, char* gender) {
StudentNode* newNode = (StudentNode*)malloc(sizeof(StudentNode));
newNode->name = name;
newNode->id = id % 10000; // 取后四位
newNode->age = age;
strncpy(newNode->gender, gender, sizeof(newNode->gender)); // 防止null终止符溢出
newNode->score[0] = newNode->score[1] = newNode->score[2] = 0.0;
newNode->next = NULL;
return newNode;
}
// 添加新学生到链表末尾
void addStudent(StudentNode** head, StudentNode* student) {
if (*head == NULL) {
*head = student;
} else {
StudentNode* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = student;
}
}
// 批量录入成绩,按学号顺序
void batchAddScore(StudentNode** head, int studentId, float scores[]) {
StudentNode* current = *head;
for (int i = 0; i < 3 && current != NULL; i++, current = current->next) {
if (current->id == studentId) {
current->score[i] = scores[i];
printf("已为学号%d的学生添加第%d门课程分数:%f\n", studentId, i + 1, scores[i]);
}
}
}
// 打印学生信息
void printStudentInfo(StudentNode* node) {
if (node == NULL) return;
printf("姓名:%s, 学号:%d, 年龄:%d, 性别:%s, 成绩:%.2f %.2f %.2f\n",
node->name, node->id, node->age, node->gender, node->score[0], node->score[1], node->score[2]);
}
int main() {
StudentNode* head = NULL;
// 输入第一个学生信息
char name[50], gender[10];
int id, age;
scanf("请输入学生信息(例如:张三 M 18): ");
scanf("%s %d %d", name, &id, &age);
StudentNode* student1 = createStudent(name, id, age, gender);
addStudent(&head, student1);
// 接收更多学生信息并录入成绩
int numStudents;
scanf("请输入学生总数: %d", &numStudents);
for (int i = 1; i <= numStudents; i++) {
char genderInput[10];
scanf("请输入学生%dx信息:姓名,性别,年龄(例如:李四 F 19): ", &name, genderInput, &age);
addStudent(&head, createStudent(name, id, age, genderInput));
// 批量录入成绩
int studentId;
float scores[3];
scanf("请输入学生%dx的三门课程分数:", &studentId);
batchAddScore(&head, studentId, scores);
}
// 打印所有学生信息
StudentNode* temp = head;
while (temp != NULL) {
printStudentInfo(temp);
temp = temp->next;
}
return 0;
}
```
在这个代码中,我们首先定义了一个`StudentNode`结构体表示学生信息,并实现了创建、添加、批量添加成绩和打印信息等功能。在`main`函数中,我们接收用户输入逐个创建学生节点,并允许用户按照提示添加和查询成绩。
阅读全文