数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库🔥🔥🔥
本文专栏 ➡️ 数据结构

学生管理系统

本实验是基于C结构体链表实现学生信息管理,包括添加、修改、删除、查询、按学号输出等基本操作

实验目的:

理解并掌握链表、栈、队列等基本数据结构的特点和应用场景。通过实际编程掌握链表在动态数据结构管理中的优势。
设计并实现一个功能完善的学生信息管理系统,能够进行添加、删除、修改、查询等基本操作。


实验内容:

本次实验要求设计并实现一个学生信息管理系统,具体需求如下:
增加学生信息:允许用户输入学生的基本信息(学号、姓名)并将其添加到系统中。
删除学生信息:根据学号删除指定的学生信息。
修改学生信息:根据学号修改指定学生的信息。
查询学生信息:根据学号查询并显示学生的信息。
统计学生人数:统计系统中学生人数。
显示所有学生信息:列出系统中所有学生的信息。


实验产出:

1.核心代码:

在这里插入代码片

2.运行结果:


操作

实验产出:

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不断前行的源泉✨!衷心感谢你的鼓励与陪伴🙏!
若你有任何疑问、见解或补充,欢迎随时留言💬,让我们在交流中共同成长📚!❤️
愿各位大佬们在技术的道路上,代码顺畅无阻💻,思路清晰如光💡,不断突破自我,向着更高的目标迈进,实现自己的梦想!🎉
再次感谢你的阅读🌸

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)

_1、从密钥中复制S3凭证并保存 &#xff08;Copy the S3 credentials from the secret and save it &#xff09; oc extract secret/ibm-lh-config-secret -n ${PROJECT_CPD_INST_OPERANDS} --to- --keysenv.properties | grep -E "LH_S3_ACCESS_KEY|LH_S3_SECRET_KEY&q…

Ragas-RAG能力评测

Ragas是一个框架&#xff0c;它可以帮助你从不同的方面评估你的问答&#xff08;QA&#xff09;流程。它为你提供了一些指标来评估你的问答系统的不同方面&#xff0c;具体包括&#xff1a; 评估检索&#xff08;context&#xff09;的指标&#xff1a;提供了上下文相关性&…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

自然语言处理(NLP)-总览图学习

文章目录 自然语言处理&#xff08;NLP&#xff09;-总览图学习1.一张总览图的学习1. 语音学&#xff08;Phonology&#xff09;2. 形态学&#xff08;Morphology&#xff09;3. 句法学&#xff08;Syntax&#xff09;4. 语义学&#xff08;Semantics&#xff09;5. 推理&#…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练&#xff08;归纳&#xff09;和预测&#xff08;演绎&#xff09; 归纳: 从具体案例中抽象一般规律…

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景 我们在做RTMP|RTSP播放器的时候&#xff0c;有这样的技术诉求&#xff0c;有的摄像头出来的数据是有角度偏差的&#xff0c;比如“装倒了”&#xff0c;或者&#xff0c;图像存在上下或者左右反转&#xff0c;这时候&#xff0c;就需要播放器能做响应的处理&#xff…

论文阅读--Qwen22.5技术报告

Qwen2 1 引言 所有模型都是在超过7 trillion token&#xff08;7万亿&#xff09;的高质量、大规模数据集上预训练的 2 Tokenizer & Model 2.1 Tokenizer 沿用Qwen&#xff08;Bai等人&#xff0c;2023a&#xff09;的做法&#xff0c;我们采用了基于字节级字节对编码…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本&#xff0c;下载以 .dmg 结尾的安装包&#xff0c;注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

阻燃高温尼龙行业:市场潜力巨大,引领材料科学新变革

在当今快速发展的工业和材料科学领域&#xff0c;阻燃高温尼龙作为一种兼具卓越防火性能和高温稳定性的新型材料&#xff0c;正逐步成为多个领域的首选材料。随着全球对安全性能要求的提高和技术的不断创新&#xff0c;阻燃高温尼龙市场呈现出快速增长的态势&#xff0c;展现出…

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…

系统学习算法:专题五 位运算

位运算总结&#xff08;默认学过位操作符的知识&#xff09;&#xff1a; 1. 这六种就是常见的位运算符&#xff0c;无进位相加就是在二进制中&#xff0c;两个数的某一位1和1可以进位&#xff0c;但是异或就不进位&#xff0c;相加后为0&#xff0c;跟相同为0&#xff0c;相异…

JVM参数-NativeMemoryTracking

实际开发场景中应该有发现Java应用程序会消耗比设置-Xms和-Xmx更多的内存&#xff0c;究其原因其实是因为JVM中除了大家熟知的堆内存外,还有所谓的非堆内存&#xff08;Non-Heap Memory&#xff09;,详细来看,非堆内存包括方法区和Java虚拟机内部做处理或优化所需的内存。 从图…

【PVE】Proxmox VE8.0+创建LXC容器安装docker

为了不影响PVE宿主机&#xff0c;通常使用套娃的形式安装Docker容器&#xff0c;再安装相关docker应用。首先在CT模板中创建 Linux 容器&#xff0c;推荐使用Debian。开启ssh登录&#xff0c;修改debian配置&#xff0c;安装docker 一、创建 LXC 容器 1、CT模板下载 点击“模…

代码随想录算法训练营day34

代码随想录算法训练营 —day34 文章目录 代码随想录算法训练营前言一、62.不同路径动态规划动态规划空间优化 二、63. 不同路径 II动态规划动态规划优化空间版 三、343. 整数拆分动态规划贪心算法 96.不同的二叉搜索树总结 前言 今天是算法营的第34天&#xff0c;希望自己能够…

Kubernetes 集群中安装和配置 Kubernetes Dashboard

前言 上篇成功部署Kubernetes集群后&#xff0c;为了方便管理和监控集群资源&#xff0c;安装Kubernetes Dashboard显得尤为重要。Kubernetes Dashboard 是一个通用的、基于 Web 的 UI&#xff0c;旨在让用户轻松地部署容器化应用到 Kubernetes 集群&#xff0c;并对这些应用进…