数据结构——实验八·学生管理系统
嗨~~欢迎来到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)的行为,这是自然语言生成中的一个重大开放问题。尽管近期一些研究在控制简单句子属性(如情感)方面取得了成功,但在复杂的细粒度控制(如…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...