文末附完整源代码
学生信息管理系统是一个用于管理学生基本信息的程序,通过链表数据结构实现学生信息的增删改查功能。系统采用C语言编写,具有良好的模块化设计和可扩展性。
系统使用单链表来存储学生信息,每个节点包含以下字段:
id
: 学生唯一标识name
: 学生姓名age
: 学生年龄score
: 学生成绩next
: 指向下一个学生节点的指针系统主要分为以下几个模块:
系统提供以下核心功能:
typedef struct Student {
int id; // 学生ID
char name[50]; // 学生姓名
int age; // 学生年龄
float score; // 学生成绩
struct Student* next; // 指向下一个学生节点的指针
} Student;
Student* createStudent(int id, const char* name, int age, float score);
void addStudent(int id, const char* name, int age, float score);
void deleteStudent(int id);
void updateStudent(int id, const char* name, int age, float score);
Student* findStudent(int id);
void displayAllStudents();
malloc()
为新节点分配内存free()
释放删除节点的内存freeList()
函数释放所有节点的内存,防止内存泄漏学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:1
请输入学生ID:1001
请输入学生姓名:张三
请输入学生年龄:18
请输入学生成绩:99
成功添加学生:张三 (ID: 1001)
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:1
请输入学生ID:1002
请输入学生姓名:李四
请输入学生年龄:20
请输入学生成绩:89
成功添加学生:李四 (ID: 1002)
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:5
========================================
ID 姓名 年龄 成绩
========================================
1001 张三 18 99.00
1002 李四 20 89.00
========================================
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:4
请输入要查找的学生ID:1002
========================================
ID:1002
姓名:李四
年龄:20
成绩:89.00
========================================
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:3
请输入要更新的学生ID:1001
请输入新姓名:张三丰
请输入新年龄:99
请输入新成绩:88
成功更新ID为1001的学生信息!
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:5
========================================
ID 姓名 年龄 成绩
========================================
1001 张三丰 99 88.00
1002 李四 20 89.00
========================================
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct Student {
int id; // 学生ID
char name[50]; // 学生姓名
int age; // 学生年龄
float score; // 学生成绩
struct Student* next; // 指向下一个学生节点的指针
} Student;
// 全局头指针,指向链表的第一个节点
Student* head = NULL;
// 函数声明
Student* createStudent(int id, const char* name, int age, float score);
void addStudent(int id, const char* name, int age, float score);
void deleteStudent(int id);
void updateStudent(int id, const char* name, int age, float score);
Student* findStudent(int id);
void displayAllStudents();
void freeList();
// 创建新学生节点
Student* createStudent(int id, const char* name, int age, float score) {
// 为新节点分配内存
Student* newStudent = (Student*)malloc(sizeof(Student));
if (newStudent == NULL) {
printf("内存分配失败!\n");
exit(1);
}
// 初始化节点数据
newStudent->id = id;
strcpy(newStudent->name, name);
newStudent->age = age;
newStudent->score = score;
newStudent->next = NULL;
return newStudent;
}
// 添加学生到链表
void addStudent(int id, const char* name, int age, float score) {
// 检查ID是否已存在
if (findStudent(id) != NULL) {
printf("ID为%d的学生已存在!\n", id);
return;
}
Student* newStudent = createStudent(id, name, age, score);
// 如果链表为空,新节点即为头节点
if (head == NULL) {
head = newStudent;
}
else {
// 找到链表尾部
Student* current = head;
while (current->next != NULL) {
current = current->next;
}
// 将新节点添加到尾部
current->next = newStudent;
}
printf("成功添加学生:%s (ID: %d)\n", name, id);
}
// 根据ID删除学生
void deleteStudent(int id) {
Student* current = head;
Student* previous = NULL;
// 查找要删除的节点
while (current != NULL && current->id != id) {
previous = current;
current = current->next;
}
// 如果未找到该ID的学生
if (current == NULL) {
printf("未找到ID为%d的学生!\n", id);
return;
}
// 删除头节点的情况
if (previous == NULL) {
head = current->next;
}
else {
// 普通情况,将前一个节点的next指向当前节点的next
previous->next = current->next;
}
// 释放被删除节点的内存
free(current);
printf("成功删除ID为%d的学生!\n", id);
}
// 根据ID更新学生信息
void updateStudent(int id, const char* name, int age, float score) {
Student* student = findStudent(id);
if (student == NULL) {
printf("未找到ID为%d的学生!\n", id);
return;
}
// 更新学生信息
if (name != NULL) {
strcpy(student->name, name);
}
if (age != -1) {
student->age = age;
}
if (score != -1) {
student->score = score;
}
printf("成功更新ID为%d的学生信息!\n", id);
}
// 根据ID查找学生
Student* findStudent(int id) {
Student* current = head;
// 遍历链表查找学生
while (current != NULL) {
if (current->id == id) {
return current;
}
current = current->next;
}
return NULL; // 未找到返回NULL
}
// 显示所有学生信息
void displayAllStudents() {
Student* current = head;
if (current == NULL) {
printf("暂无学生信息!\n");
return;
}
printf("========================================\n");
printf("ID\t姓名\t年龄\t成绩\n");
printf("========================================\n");
while (current != NULL) {
printf("%d\t%s\t%d\t%.2f\n",
current->id, current->name, current->age, current->score);
current = current->next;
}
printf("========================================\n");
}
// 释放链表占用的所有内存
void freeList() {
Student* current = head;
Student* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
head = NULL;
}
// 主函数
int main() {
int choice, id, age;
char name[50];
float score;
Student* student;
while (1) {
printf("\n学生信息管理系统\n");
printf("========================\n");
printf("1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 更新学生信息\n");
printf("4. 查找学生\n");
printf("5. 显示所有学生\n");
printf("6. 退出\n");
printf("========================\n");
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入学生ID:");
scanf("%d", &id);
printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入学生年龄:");
scanf("%d", &age);
printf("请输入学生成绩:");
scanf("%f", &score);
addStudent(id, name, age, score);
break;
case 2:
printf("请输入要删除的学生ID:");
scanf("%d", &id);
deleteStudent(id);
break;
case 3:
printf("请输入要更新的学生ID:");
scanf("%d", &id);
// 输入要更新的信息
printf("请输入新姓名:");
scanf("%s", name);
printf("请输入新年龄:");
scanf("%d", &age);
printf("请输入新成绩:");
scanf("%f", &score);
updateStudent(id, name, age, score);
break;
case 4:
printf("请输入要查找的学生ID:");
scanf("%d", &id);
student = findStudent(id);
if (student != NULL) {
printf("========================================\n");
printf("ID:%d\n", student->id);
printf("姓名:%s\n", student->name);
printf("年龄:%d\n", student->age);
printf("成绩:%.2f\n", student->score);
printf("========================================\n");
}
else {
printf("未找到ID为%d的学生!\n", id);
}
break;
case 5:
displayAllStudents();
break;
case 6:
freeList(); // 释放链表内存
printf("感谢使用学生信息管理系统,再见!\n");
return 0;
default:
printf("无效的选择,请重新输入!\n");
}
}
}