数据结构——实验八·学生管理系统
嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库🔥🔥🔥
本文专栏 ➡️ 数据结构
学生管理系统
本实验是基于C结构体链表实现学生信息管理,包括添加、修改、删除、查询、按学号输出等基本操作
实验目的:
理解并掌握链表、栈、队列等基本数据结构的特点和应用场景。通过实际编程掌握链表在动态数据结构管理中的优势。
 设计并实现一个功能完善的学生信息管理系统,能够进行添加、删除、修改、查询等基本操作。
实验内容:
本次实验要求设计并实现一个学生信息管理系统,具体需求如下:
 增加学生信息:允许用户输入学生的基本信息(学号、姓名)并将其添加到系统中。
 删除学生信息:根据学号删除指定的学生信息。
 修改学生信息:根据学号修改指定学生的信息。
 查询学生信息:根据学号查询并显示学生的信息。
 统计学生人数:统计系统中学生人数。
 显示所有学生信息:列出系统中所有学生的信息。
实验产出:
1.核心代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>#define NO_LENGTH  20
#define NAME_LENGTH 11/* 定义学生结构体的数据结构 */
typedef struct Student{char studentNo[NO_LENGTH];char studentName[NAME_LENGTH];
} st;/* 定义每条记录或节点的数据结构 */
typedef struct node {struct Student data; // 数据域struct node *next; // 指针域
} Node, *Link;  // Node为node类型的别名, Link为node类型的指针别名void inputStudent(Link l){printf("请输入学生学号:");scanf("%19s", l->data.studentNo); // 防止缓冲区溢出printf("请输入学生的姓名:");scanf("%10s", l->data.studentName); // 防止缓冲区溢出// 每个新创建的节点的next域都初始化为NULLl->next = NULL;
}void inputStudentNo(char s[], char no[]){printf("请输入要%s的学生学号:", s);scanf("%19s", no); // 防止缓冲区溢出
}/* 显示学生记录 */
bool displayNode(Link head){Link p = head->next;while (p != NULL) {printf("学号:%s 姓名:%s\n", p->data.studentNo, p->data.studentName);p = p->next;}if (head->next == NULL) return false;
return true; 
}/* 增加学生记录 */
bool addNode(Link head){Link p, q;Link node = (Link)malloc(sizeof(Node));if (node == NULL) {printf("内存分配失败。\n");return false;}inputStudent(node);q = head;p = head->next;if (head->next == NULL) {// 链表为空时head->next = node;} else {// 循环访问链表中的所有节点while (p != NULL) {if (strcmp(node->data.studentNo, p->data.studentNo) < 0) {// 如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序q->next = node;node->next = p;return true;} else {// 如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持q p一前一后)q = p;p = p->next;}}// 如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面q->next = node;}return true;
}/* 删除学生记录 */
bool deleteNode(Link head){char no[NO_LENGTH];inputStudentNo("删除", no);Link p = head, q = head;while (p->next != NULL && strcmp(p->next->data.studentNo, no) != 0) {q = p;p = p->next;}if (p->next != NULL && strcmp(p->next->data.studentNo, no) == 0) {Link temp = p->next;p->next = p->next->next;free(temp);return true;}return false;
}/* 查询学生记录 */
bool queryNode(Link head){char no[NO_LENGTH];inputStudentNo("查询", no);Link p = head->next;while (p != NULL) {if (strcmp(p->data.studentNo, no) == 0) {printf("学号:%s 姓名:%s\n", p->data.studentNo, p->data.studentName);return true;}p = p->next;}return false;
}/* 修改学生记录 */
bool modifyNode(Link head){char no[NO_LENGTH];inputStudentNo("修改", no);Link p = head->next;while (p != NULL) {if (strcmp(p->data.studentNo, no) == 0) {printf("请输入新的姓名:");scanf("%10s", p->data.studentName); // 防止缓冲区溢出return true;}p = p->next;}return false;
}/* 统计学生人数 */
int countNode(Link head){Link p = head->next;int count = 0;while (p != NULL) {count++;p = p->next;}return count;
}/* 清除链表 */
void clearLink(Link head){Link p, q;p = head->next;while (p != NULL) {q = p->next;free(p);p = q;}free(head);
}// 显示菜单
void myMenu() {printf("\n\n\n"); printf("\t*            --菜单--            *\n");printf("\t**********************************\n");printf("\t*    1---------增加学生记录      *\n");printf("\t*    2---------删除学生记录      *\n");printf("\t*    3---------查询学生记录      *\n");printf("\t*    4---------修改学生记录      *\n");printf("\t*    5---------统计学生人数      *\n");printf("\t*    6---------显示学生记录      *\n");printf("\t*    7---------退出系统          *\n");printf("\t**********************************\n");}int Stu() {int select;int count;int num;Link head;  // 定义链表// 建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据head = (Link)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败。\n");return 1;}head->next = NULL;while (1) {// myMenu();printf("请输入你的选择(1-7):");  // 显示提示信息scanf("%d", &select);switch (select) {case 1:// 增加学生记录printf("请输入需要添加的学生个数:");scanf("%d", &num);int n = num;while(num) {addNode(head);num--;}if (!num)printf("成功插入%d个学生记录。\n\n", n);elseprintf("插入学生记录失败。\n\n");break;case 2:// 删除学生记录if (deleteNode(head))printf("成功删除一个学生记录。\n\n");elseprintf("没有找到要删除的学生节点。\n\n");break;case 3:// 查询学生记录if (queryNode(head))printf("成功找到学生记录。\n\n");elseprintf("没有找到要查询的学生节点。\n\n");break;case 4:// 修改学生记录if (modifyNode(head))printf("成功修改一个学生记录。\n\n");elseprintf("没有找到要修改的学生节点。\n\n");break;case 5:// 统计学生人数count = countNode(head);printf("学生人数为:%d\n\n", count);break;case 6:// 显示学生记录// displayNode(head);if(displayNode(head))printf("\n");elseprintf("链表为空,没有学生记录。\n\n");break;case 7:// 退出前清除链表中的所有结点clearLink(head);printf("\t成功清除系统并退出!");return 0;default:printf("输入不正确,应该输入1-7之间的数。\n\n");break;}}return 0;
}int main() {
myMenu();
Stu();
}2.运行结果:
 
 

3.调试:
 显示添加0个记录的空系统、删除系统中不存在的学生记录、查询系统中不存在的学生记录、修改系统中不存在的学生记录等错误调试结果等待你亲自探索哦🤟

如果你觉得这篇文章对你有所启发,请为博客点赞👍、收藏⭐️、评论💬或分享🔗,你的支持是Tubishu不断前行的源泉✨!衷心感谢你的鼓励与陪伴🙏!
若你有任何疑问、见解或补充,欢迎随时留言💬,让我们在交流中共同成长📚!❤️
愿各位大佬们在技术的道路上,代码顺畅无阻💻,思路清晰如光💡,不断突破自我,向着更高的目标迈进,实现自己的梦想!🎉
再次感谢你的阅读🌸
相关文章:
 
数据结构——实验八·学生管理系统
嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...
 
力扣hot100-->滑动窗口、贪心
你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…...
Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口
在 Linux 内核的开发中,高效处理并发任务和数据结构的管理是提升系统性能的关键。特别是在网络子系统中,处理大量数据包的任务对性能和并发性提出了极高的要求。本文将深入探讨 Linux 内核中的 hlist_add_head_rcu 函数及其在 NAPI(网络接收处理接口)中的应用,揭示这些机制…...
 
centos哪个版本建站好?centos最稳定好用的版本
在信息化飞速发展的今天,服务器操作系统作为构建网络架构的基石,其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统,凭借其强大的性能、出色的稳定性和丰富的软件包资源,成为众多用户建…...
软件越跑越慢的原因分析
如果是qt软件,可以用Qt Creator Profiler 作性能监控如果是通过web请求,可以用JMeter监控。 软件运行过程中逐渐变慢的现象,通常是因为系统资源(如 CPU、内存、磁盘 I/O 等)逐渐被消耗或软件中存在性能瓶颈。这个问题…...
LeetCode 力扣热题100 二叉树的直径
class Solution { public:// 定义一个变量 maxd,用于存储当前二叉树的最大直径。int maxd 0; // 主函数,计算二叉树的直径。int diameterOfBinaryTree(TreeNode* root) {// 调用 maxDepth 函数进行递归计算,并更新 maxd。maxDepth(root);// …...
 
【图文详解】lnmp架构搭建Discuz论坛
安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…...
小哆啦解题记:整数转罗马数字
小哆啦解题记:整数转罗马数字 小哆啦开始力扣每日一题的第十四天 https://leetcode.cn/problems/integer-to-roman/submissions/595220508/ 第一章:神秘的任务 一天,哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想:…...
 
【Java数据结构】排序
【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法:挖坑法ÿ…...
我的求职之路合集
我把我秋招和春招的一些笔面试经验在这里发一下,网友们也可以参考一下。 我的求职之路:(1)如何谈自己的缺点 我的求职之路:(2)找工作时看重的点 我的求职之路:(3&…...
 
数据结构(四) B树/跳表
目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…...
 
Arcgis国产化替代:Bigemap Pro正式发布
在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…...
 
LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验
为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务(LBS)开发微课堂” 系列技术案例 第六期的主题是 《AI向导接口服务的能力与接入方案》 随着地图应…...
 
AI导航工具我开源了利用node爬取了几百条数据
序言 别因今天的懒惰,让明天的您后悔。输出文章的本意并不是为了得到赞美,而是为了让自己能够学会总结思考;当然,如果有幸能够给到你一点点灵感或者思考,那么我这篇文章的意义将无限放大。 背景 随着AI的发展市面上…...
 
openstack单机安装
openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本,请参考openstack官网。 网卡配置 需要配…...
 
Vue3实现小红书瀑布流布局任意组件动态更新页面方法实践
思路 1.首先定义一个瀑布流容器,它的高度暂定(后面会更新)。把需要布局的组件(这里叫做waterfall-item)放在瀑布流容器里面渲染出来。使用绝对定位(position: absolute),把它移到屏幕…...
 
深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 LSTM模型一直是一个很经典的模型,一般用于序列数据预测,这个可以很好的挖掘数据上下文信息,本文将使用LSTM进行糖尿病…...
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
什么是中间件? 在 Next.js 中,中间件(Middleware)是一种用于处理每个传入请求的功能。它允许你在请求到达页面之前对其进行修改或响应。 通过中间件,你可以实现诸如日志记录、身份验证、重定向、CORS配置、压缩等任务…...
python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
目录 鼠标事件 悬停 移动 按键 点击 滚轮操作 拖拽 键盘事件 输入文本内容 type输入内容 fill输入内容 按键操作press 文件上传 下拉选/单选框/复选框 滚动条操作 鼠标事件 悬停 page.get_by_text(设置,exactTrue).nth(1).hover() 移动 page.mouse.move(x33…...
 
【论文+源码】Diffusion-LM 改进了可控文本生成
这篇论文探讨了如何在不重新训练的情况下控制语言模型(LM)的行为,这是自然语言生成中的一个重大开放问题。尽管近期一些研究在控制简单句子属性(如情感)方面取得了成功,但在复杂的细粒度控制(如…...
 
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
 
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
 
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
 
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
 
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
 
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
 
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
 
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
