有10个学生,学生学籍库包括:学号、姓名、性别、出生年月、第二学期 大学英语和数据结构的成绩。选用合适的数据结构抽象学生学籍库,本次实训要 求使用链表结构,同时要求选用合适的存储方式,即把学籍库抽象成一个以学号 作为主关键字的动态查找表,并用链表表示和储存它,在自己构建的链表上实现 学生信息查询算法。编写程序,使之能提供以下功能。 1)系统菜单(即先输出提示信息序号1、2、3…,分别实现什么功能,输 入序号后,调用相应的功能函数)。 2)学生信息录入功能。 3)学生信息删除功能。 4)显示学生信息。 5)学生信息查找。 6)依据总分成绩对学生信息进行排序。要求:用c语言链式存储
时间: 2024-03-13 14:46:40 浏览: 151
c语言:学生学籍信息管理系统(链表类)
5星 · 资源好评率100%
好的,以下是一个简单的C语言链式存储学生学籍库的实现,包括上述要求的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 20
// 定义学生结构体
typedef struct student {
int id; // 学号
char name[MAX_NAME_LENGTH]; // 姓名
char gender; // 性别
char birth[11]; // 出生年月,格式为“yyyy-mm-dd”
float eng_score; // 第二学期大学英语成绩
float ds_score; // 第二学期数据结构成绩
struct student* next; // 指向下一个学生节点的指针
} Student;
// 全局变量,指向学生链表的头节点
Student* head = NULL;
// 显示系统菜单
void showMenu() {
printf("1. 学生信息录入\n");
printf("2. 学生信息删除\n");
printf("3. 显示学生信息\n");
printf("4. 学生信息查找\n");
printf("5. 依据总分成绩排序\n");
printf("0. 退出程序\n");
printf("请输入选项序号:");
}
// 插入学生信息
void insertStudent() {
Student* newStudent = (Student*)malloc(sizeof(Student));
printf("请输入学号:");
scanf("%d", &newStudent->id);
printf("请输入姓名:");
scanf("%s", newStudent->name);
printf("请输入性别(m/f):");
scanf(" %c", &newStudent->gender);
printf("请输入出生年月(yyyy-mm-dd):");
scanf("%s", newStudent->birth);
printf("请输入第二学期大学英语成绩:");
scanf("%f", &newStudent->eng_score);
printf("请输入第二学期数据结构成绩:");
scanf("%f", &newStudent->ds_score);
newStudent->next = NULL;
// 从头节点开始遍历链表,找到尾节点并插入新学生节点
if (head == NULL) {
head = newStudent;
} else {
Student* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newStudent;
}
printf("学生信息录入成功!\n");
}
// 删除学生信息
void deleteStudent() {
int id;
printf("请输入要删除学生的学号:");
scanf("%d", &id);
// 遍历链表,找到要删除的学生节点并删除
if (head == NULL) {
printf("学生信息库为空!\n");
} else {
Student* current = head;
Student* previous = NULL;
while (current != NULL && current->id != id) {
previous = current;
current = current->next;
}
if (current == NULL) {
printf("未找到该学生!\n");
} else {
if (previous == NULL) {
head = current->next;
} else {
previous->next = current->next;
}
free(current);
printf("学生信息删除成功!\n");
}
}
}
// 显示学生信息
void displayStudent() {
if (head == NULL) {
printf("学生信息库为空!\n");
} else {
printf("学号\t姓名\t性别\t出生年月\t第二学期英语成绩\t第二学期数据结构成绩\n");
Student* current = head;
while (current != NULL) {
printf("%d\t%s\t%c\t%s\t\t%.2f\t\t\t%.2f\n", current->id, current->name, current->gender, current->birth, current->eng_score, current->ds_score);
current = current->next;
}
}
}
// 查找学生信息
void searchStudent() {
int id;
printf("请输入要查找学生的学号:");
scanf("%d", &id);
// 遍历链表,找到要查找的学生节点并输出信息
if (head == NULL) {
printf("学生信息库为空!\n");
} else {
Student* current = head;
while (current != NULL && current->id != id) {
current = current->next;
}
if (current == NULL) {
printf("未找到该学生!\n");
} else {
printf("学号\t姓名\t性别\t出生年月\t第二学期英语成绩\t第二学期数据结构成绩\n");
printf("%d\t%s\t%c\t%s\t\t%.2f\t\t\t%.2f\n", current->id, current->name, current->gender, current->birth, current->eng_score, current->ds_score);
}
}
}
// 计算学生总分
float calculateTotalScore(Student* student) {
return student->eng_score + student->ds_score;
}
// 按总分排序
void sortStudent() {
if (head == NULL || head->next == NULL) {
printf("学生信息库为空或只有一个学生!\n");
} else {
// 冒泡排序
Student* current = head;
while (current->next != NULL) {
Student* inner = head;
while (inner->next != NULL) {
if (calculateTotalScore(inner) < calculateTotalScore(inner->next)) {
// 交换两个学生节点的位置
Student* temp = (Student*)malloc(sizeof(Student));
memcpy(temp, inner, sizeof(Student));
memcpy(inner, inner->next, sizeof(Student));
memcpy(inner->next, temp, sizeof(Student));
free(temp);
}
inner = inner->next;
}
current = current->next;
}
printf("学生信息已按总分排序!\n");
}
}
int main() {
int option;
do {
showMenu();
scanf("%d", &option);
switch (option) {
case 1:
insertStudent();
break;
case 2:
deleteStudent();
break;
case 3:
displayStudent();
break;
case 4:
searchStudent();
break;
case 5:
sortStudent();
break;
case 0:
printf("程序已退出!\n");
break;
default:
printf("无效选项,请重新选择!\n");
}
} while (option != 0);
// 释放链表节点的内存
Student* current = head;
while (current != NULL) {
Student* temp = current->next;
free(current);
current = temp;
}
return 0;
}
```
这个程序使用了C语言的链表结构来抽象学生学籍库,并以学号作为主关键字实现了动态查找表。同时实现了学生信息录入、删除、显示、查找和按总分排序等功能。
阅读全文