学生信息管理系统
代码概述
学生信息管理系统,使用了单链表数据结构来存储和管理学生的信息。系统包括录入、删除、查找、修改、显示学生信息等功能。主要由头文件定义、功能函数实现和主程序组成。
头文件 student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <myhead.h>
typedef struct Stu {
char name[50]; // 学生姓名,长度为50
int score; // 学生分数
int age; // 学生年龄
char phone[15]; // 学生电话,长度为15
} Stu;
typedef struct Node {
Stu stu; // 学生信息
int len; // 链表长度
struct Node *next; // 链表指针
} Node, *PNode;
// 函数声明
PNode create_list(void);
void inputstu(PNode L);
void delstu(PNode L);
void modstu(PNode L);
void search_name(PNode L);
void show_stu(PNode L);
#endif
Stu
结构体: 存储学生的基本信息,包括姓名、分数、年龄和电话。Node
结构体: 链表节点,包含学生信息 (Stu
)、链表长度 (len
),以及指向下一个节点的指针 (next
)。- 函数声明: 提供了创建链表、录入、删除、修改、查找和显示学生信息的功能。
功能函数实现
#include "stu.h"
// 创建链表并初始化
PNode create_list(void) {
PNode L = (PNode)malloc(sizeof(Node));
if (L == NULL) {
printf("内存分配失败。\n");
exit(1);
}
L->next = NULL; // 初始化链表头指针为空
L->len = 0; // 初始化链表长度为0
return L;
}
// 录入学生信息
void inputstu(PNode L) {
PNode p = (PNode)malloc(sizeof(Node));
if (p == NULL) {
printf("内存分配失败。\n");
exit(1);
}
printf("请输入学生的姓名: ");
scanf("%s", p->stu.name);
printf("请输入学生的分数: ");
scanf("%d", &p->stu.score);
printf("请输入学生的年龄: ");
scanf("%d", &p->stu.age);
printf("请输入学生的电话: ");
scanf("%s", p->stu.phone);
p->next = L->next;
L->next = p;
L->len++;
printf("学生信息录入成功。\n");
show_stu(L);
}
// 删除学生信息
void delstu(PNode L) {
if (L->next == NULL) {
printf("链表为空,无法删除。\n");
return;
}
printf("请输入要删除的学生姓名: ");
char name[50];
scanf("%s", name);
PNode prev = L;
PNode curr = L->next;
while (curr != NULL && strcmp(curr->stu.name, name) != 0) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("未找到该学生。\n");
return;
}
prev->next = curr->next;
free(curr);
L->len--;
printf("学生信息删除成功。\n");
show_stu(L);
}
// 修改学生年龄
void modstu(PNode L) {
printf("请输入学生的分数: ");
int score;
scanf("%d", &score);
PNode curr = L->next;
int found = 0; // 标志是否找到学生
while (curr != NULL) {
if (curr->stu.score == score) {
printf("找到学生:姓名 = %s, 当前年龄 = %d\n", curr->stu.name, curr->stu.age);
printf("请输入新的学生年龄: ");
scanf("%d", &curr->stu.age);
printf("学生年龄修改成功。\n");
found = 1;
break;
}
curr = curr->next;
}
if (!found) {
printf("未找到分数为 %d 的学生。\n", score);
}
show_stu(L); // 显示所有学生信息
}
// 查找学生
void search_name(PNode L) {
printf("请输入要查找的学生姓名: ");
char name[50];
scanf("%s", name);
PNode curr = L->next;
while (curr != NULL && strcmp(curr->stu.name, name) != 0) {
curr = curr->next;
}
if (curr != NULL) {
printf("学生存在: 姓名 = %s, 分数 = %d, 年龄 = %d, 电话 = %s\n",
curr->stu.name, curr->stu.score, curr->stu.age, curr->stu.phone);
} else {
printf("未找到该学生。\n");
}
}
// 显示所有学生信息
void show_stu(PNode L) {
if (L->next == NULL) {
printf("链表为空,无学生信息。\n");
return;
}
PNode curr = L->next;
while (curr != NULL) {
printf("姓名: %s, 分数: %d, 年龄: %d, 电话: %s\n",
curr->stu.name, curr->stu.score, curr->stu.age, curr->stu.phone);
curr = curr->next;
}
}
create_list
: 创建链表的头节点,初始化链表为空。inputstu
: 录入一个学生的信息并插入到链表头部,更新链表长度,并显示所有学生信息。delstu
: 删除指定姓名的学生信息,调整链表指针,并更新链表长度。modstu
: 根据学生分数修改学生的年龄,如果找到匹配的学生则更新其年龄,并显示所有学生信息。search_name
: 查找并显示指定姓名的学生信息。show_stu
: 显示链表中所有学生的信息。
主程序
#include "stu.h"
int main() {
int choice;
PNode L = create_list(); // 创建链表
while (1) {
printf("----------------------------------\n");
printf("1. 录入学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 按姓名查找学生\n");
printf("4. 按学生分数修改年龄\n");
printf("5. 显示所有学生信息\n");
printf("6. 退出\n");
printf("----------------------------------\n");
printf("请输入序号:\n");
scanf("%d", &choice);
switch (choice) {
case 1:
inputstu(L);
break;
case 2:
delstu(L);
break;
case 3:
search_name(L);
break;
case 4:
modstu(L);
break;
case 5:
show_stu(L);
break;
case 6:
while (L != NULL) {
PNode temp = L;
L = L->next;
free(temp);
}
printf("程序退出。\n");
return 0;
default:
printf("无效的选择,请重新输入。\n");
}
}
return 0;
}
- 主循环: 提供一个菜单供用户选择操作,调用对应的函数来实现不同的功能。
- 退出: 释放链表中的所有节点,并退出程序。
简单的学生信息管理系统提供了基本的增、删、改、查和显示功能,利用链表来动态管理学生数据。