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

嗨~~欢迎来到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…

STM32 低功耗设计:从原理到实现的详细介绍

在现代嵌入式系统中&#xff0c;尤其是在需要长时间工作且电池供电的设备中&#xff0c;低功耗设计至关重要。STM32作为一种流行的微控制器系列&#xff0c;广泛应用于便携设备、传感器网络、可穿戴设备等领域&#xff0c;提供了多种低功耗模式来延长电池使用时间并优化整体能效…

View Shadcn UI 2025.1.2 发布公告:全新跑马灯组件与多项优化更新

亲爱的开发者们&#xff1a; 我们很高兴地宣布 View Shadcn UI 2025.1.2 版本正式发布&#xff01;本次更新带来了全新的跑马灯组件&#xff0c;并对多个现有组件进行了功能增强和问题修复。 &#x1f680; 重要链接 GitHub 仓库&#xff1a;https://github.com/devlive-comm…

Ragas-RAG能力评测

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

“深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手

TCP&#xff08;传输控制协议&#xff09;的三次握手和四次挥手是TCP连接建立和释放的过程。 一、TCP三次握手 TCP三次握手是为了建立可靠的连接&#xff0c;确保客户端和服务器之间的通信能力。具体过程如下&#xff1a; 第一次握手&#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…

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 目录 【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 优势 适用场景 项目结构 关键代码 优势 消除 switch&#xff1a;将分支逻辑分散到独立的策略类中。 开闭原则&#xff1a;新增类型只需添加新的 TypeHa…

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

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

# [Unity] [游戏开发]基础协程应用与实现详解

协程(Coroutine)是Unity中一种用于处理复杂定时逻辑的非常有用的工具。通过协程,可以轻松地在多个帧之间分步执行任务,而不阻塞主线程。本文将介绍如何在Unity中使用协程,并通过简单的实例展示协程的基本应用。 1. 协程的基础概念 在Unity中,协程是通过IEnumerator函数…

Kivy App开发之UX控件Bubble气泡

kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…

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…

某大厂一面:Java 构造器是否可以被重写

在 Java 中&#xff0c;构造器&#xff08;Constructor&#xff09;不能被重写&#xff08;Override&#xff09;。这是因为构造器是用于创建对象并初始化对象状态的特殊方法&#xff0c;它与类的实例化过程紧密相关。以下是对这一问题的详细解释&#xff1a; 1. 构造器的特点 …

自然语言处理(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…

centos 安全配置基线

CentOS 是一个广泛使用的操作系统&#xff0c;为了确保系统的安全性&#xff0c;需要遵循一系列的安全基线。以下是详细的 CentOS 安全基线配置建议&#xff1a; 通过配置核查,CentOS操作系统未安装入侵防护软件,无法检测到对重要节点进行入侵的 解决方案&#xff1a; 安装入侵…

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

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

网络安全等级保护基本要求——等保二级

《信息安全技术网络安全等级保护基本要求》GB/T22239-2019 7.1 安全通用要求 7.1.1 安全物理环境 7.1.1.1 物理位置选择 本项要求包括&#xff1a; a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内;b) 机房场地应避免设在建筑物的顶层或地下室&#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 官方…