当前位置: 首页 > news >正文

数据结构之分文件编译学生管理

list.h

#ifndef LIST_H_
#define LIST_H_
#define MAX 30
typedef struct
{int id;//学号char name[20];//姓名char major[20];//专业int age;//年龄
}student,*Pstudent;typedef struct
{student data[MAX];//储存学生信息的数组int len;//统计学生个数
}list,*Plist;Plist create_list();
student input();int input_list(Plist);int output_list(Plist);
int full(Plist);
int insert_stu(Plist,int,student);
int delete_stu(Plist,int);
int inserach_stu(Plist,int);
int change_stu(Plist,int,student);
int head(Plist,student);
int insert_real(Plist,student);
int delete_rev(Plist);
int find_student(Plist,char*);#endif

list.c

#include<myhead.h>
#include"list.h"
Plist create_list()
{Plist L = malloc(sizeof(list));if(NULL==L){printf("申请空间失败\n ");return NULL;}L->len= 0;printf("创建成功\n");return L;
}
int input_list(Plist L)
{int n;printf("请输入学生个数:\n");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入第%d个学生信息:\n",i+1);printf("请输入学号:");scanf("%d",&L->data[i].id);printf("请输入姓名:");scanf("%s",L->data[i].name);printf("请输入专业:");scanf("%s",L->data[i].major);printf("请输入年龄:");scanf("%d",&L->data[i].age);L->len++;//计数器}return 0;
}
int output_list(Plist L)
{int i;for(i = 0;i<L->len;i++){printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",\L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);}return 0;
}
int full(Plist L)
{if(L->len==MAX){return 1;}return 0;
}int insert_stu(Plist L,int pos,student e)
{int sub = pos-1;if(sub<0||sub>L->len||L==NULL||full(L)){printf("插入失败!\n");return -1;}int i;for(i=L->len ; i>=sub ; i--){L->data[i+1]=L->data[i];}L->data[sub] = e;L->len++;printf("插入成功!\n");return 0;}
int delete_stu(Plist L,int pos)
{int i,sub=pos-1;if(sub<0||sub>L->len||L==NULL||L->len==0){printf("删除失败\n");return -1;}for(i=sub;i<=L->len-1;i++){L->data[i]=L->data[i+1];}L->len--;printf("删除成功!\n");return 0;
}
int inserach_stu(Plist L,int pos)
{int i,sub=pos-1;if(sub<0||sub>L->len||L==NULL||L->len==0){printf("查找失败\n");return -1;}printf("学生存在\n");printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",\L->data[sub].id,L->data[sub].name,L->data[sub].major,L->data[sub].age);return 0;
}int change_stu(Plist L,int pos,student e1)
{int sub = pos-1;if(sub<0||sub>L->len||L==NULL||L->len==0){printf("修改失败\n");return -1;}L->data[sub] = e1;printf("修改成功\n");return 0;}
int head(Plist L,student e2){if(L==NULL||full(L)){printf("插入表头失败!\n");return -1;}int i;for(i=L->len-1;i>=0;i--){L->data[i+1]=L->data[i];}L->data[0]=e2;L->len++;printf("表头插入成功!\n");return 0;
}int insert_real(Plist L,student e2){if(L==NULL||full(L)){printf("插入失败!");return -1;}L->data[L->len]=e2;L->len++;printf("表尾插入!\n");return 0;}int delete_rev(Plist L)
{int i,j;for(i=0;i<L->len;i++){for(j=i+1;j<L->len;j++){if(strcmp(L->data[i].name,L->data[j].name)==0){delete_stu(L,j+1);j--;}}}}
student input(){student e;printf("请输入学号:");scanf("%d",&e.id);printf("请输入姓名:");scanf("%s",e.name);printf("请输入专业:");scanf("%s",e.major);printf("请输入年龄:");scanf("%d",&e.age);return e;
}int find_student(Plist L,char key[20]){int i,sub=-1;for(i=0;i<L->len;i++){if(strcmp(key,L->data[i].name)==0){printf("位置%d\t是%s\n",i+1,L->data[i].name);sub=1;}}if(sub==-1){printf("查找失败\n");return -1;}return 0;
}

 mymain.c

#include <myhead.h>
#include "list.h"
int main(int argc, const char *argv[])
{Plist L = create_list();//创建顺序表返回顺序表地址	input_list(L);while(1){printf("\t\t\t请输入执行的功能\n");printf("\t\t\t1.插入一个学生\n");printf("\t\t\t2.删除一个学生\n");printf("\t\t\t3.查找一个学生\n");printf("\t\t\t4.修改一个学生\n");printf("\t\t\t5.表头插入\n");printf("\t\t\t6.表尾插入\n");printf("\t\t\t7.去重\n");printf("\t\t\t8.根据姓名查找\n");printf("\t\t\t9.退出\n");int n;scanf("%d",&n);switch(n){case 1:{int x=0;student E =input();printf("请输入插入位置:");scanf("%d",&x);insert_stu(L,x,E);output_list(L);break;}case 2:{ 	int x=0;printf("请输入删除位置:");scanf("%d",&x);delete_stu(L,x);output_list(L);break;}case 3:{ 	int x=0;printf("查找一个学生:");scanf("%d",&x);inserach_stu(L,x);break;}case 4:{ 	int x=0;student E = input();printf("请输入修改的位置:");scanf("%d",&x);change_stu(L,x,E);output_list(L);break;}case 5:{printf("请输入表头插入的内容:\n");student e=input();head(L,e);output_list(L);break;}case 6:{ printf("请输入表尾插入的内容:\n");student e=input();insert_real(L,e);output_list(L);break;}case 7:{ 	printf("进行去重操作\n");delete_rev(L);output_list(L);break;}case 8:{ 	char key[20];printf("请输入查找学生的姓名\n");scanf("%s",key);find_student(L,key);break;}case 9:{ 	return 0;break;}}}return 0;
}

展示效果: 

运行,进行功能测试:

 

 

 

 

相关文章:

数据结构之分文件编译学生管理

list.h #ifndef LIST_H_ #define LIST_H_ #define MAX 30 typedef struct {int id;//学号char name[20];//姓名char major[20];//专业int age;//年龄 }student,*Pstudent;typedef struct {student data[MAX];//储存学生信息的数组int len;//统计学生个数 }list,*Plist;Plist c…...

TypeScript入门 (二)控制语句

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分&#xff1b;希望通过我的知识点总结&#xff0c;能够帮助你更好地…...

MVP 最简可行产品

MVP&#xff08;最小可行产品&#xff09;是一种产品开发策略&#xff0c;其主要目的是用最少的时间和资源&#xff0c;开发一个包含最基本必要功能的产品。这样做的目的是能够以最小的成本进入市场&#xff0c;获取用户反馈&#xff0c;再根据反馈逐步优化产品。 MVP是什么 …...

数仓工具:datax

datax可以理解为sqoop的优化版&#xff0c; 速度比sqoop快 因为sqoop底层是map任务&#xff0c;而datax底层是基于内存 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定…...

CSS传统布局方法(补充)——WEB开发系列37

开发技术不断演进&#xff0c;布局方式也经历了多个阶段的变革。从最初的基于表格布局到 CSS 的浮动布局&#xff0c;再到今天的弹性盒&#xff08;Flexbox&#xff09;与 CSS Grid 网格布局&#xff0c;每一种布局方式都有其独特的背景和解决特定问题的优势。 一、CSS Grid 出…...

【系统架构设计师】软件架构的风格(经典习题)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2题】【第3~4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15~16题】【第17题】【第18~19题】【第20~21题】【第22题】【第23题】【第24~…...

网页打开时,下载的文件fetcht类型?有什么作用?

‌fetch API‌是一种用于向服务器发送请求并获取响应的现代Web API。它支持获取各种类型的数据&#xff0c;包括文本、JSON、图像和文件等。fetch API的主要优势之一是支持流式传输和取消请求&#xff0c;这使得处理大型数据集和长时间运行的操作变得更加简单和可靠。此外&…...

作为HR,如何考察候选人的专业知识与技能

这是严肃的话题&#xff0c;如何考察候选人的专业知识和技能。HR招聘是一个让我们既爱又恨的过程。爱的是&#xff0c;我们有机会遇到各种各样的人才&#xff1b;恨的是&#xff0c;要从茫茫人海中找到那个“对的人”简直比找一根针在干草堆里还难。 本系列的文章&#xff0c;…...

阻止冒泡事件

每一div都有一个切换事件 div里包括【复制】事件&#xff0c; 点击【复制按钮】&#xff0c;会触发【切换事件】 因为冒泡 在 Vue 3 中&#xff0c;阻止 click 事件冒泡可以使用以下常规方法&#xff1a; 1 事件修饰符&#xff1a;Vue 3 中提供了多种事件修饰符&#xff0c…...

聊聊Netty对于内存方面的优化

写在文章开头 Netty通过巧妙的内存使用技巧尽可能节约内存空间,进而减少java中Full gc的STW的时间,由此间接的提升了程序的性能,本文也将直接从源码的角度分析一下Netty对于内存方面的使用技巧,希望对你有所启发。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java…...

2024年轻人驯化AI指南

或许Python编程是答案 我为您精心准备了一份全面的Python学习大礼包&#xff0c;完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者&#xff0c;都欢迎加入我们的学习之旅&#xff0c;共同交流进步&#xff01; &…...

算法:双指针题目练习

文章目录 算法:双指针移动零复写零快乐数盛最多水的容器有效三角形的个数查找总价格为目标值的两个商品三数之和四数之和 总结 算法:双指针 移动零 定义两个指针,slow和fast.用这两个指针把整个数组分成三块. [0,slow]为非零元素,[slow1,fast-1]为0元素,[fast,num.length]为未…...

傅里叶变换的基本性质和有关定理

一、傅里叶变换的基本性质 1.1 线性性质 若 则 其中:a,b是常数 函数线性组合的傅里叶变换等于歌函数傅里叶变换的相应组合。 1.2 对称性 若 则 关于傅里叶变换的对称性还有 虚、实、奇、偶函数的傅里叶变换性质: 1.3 迭次傅里叶变换 对f(x,y)连续两次做二维傅里叶变换…...

VIM使用技巧

VIM使用技巧&#xff1b;VIM常用快捷键&#xff1b;vim常用命令&#xff1b;VIM常用快捷命令&#xff1b;vim使用技巧 VIM使用技巧 移动光标 hjkl&#xff0c;h光标向前移动一个字符的位置&#xff1b;j光标向下移动一行;k光标向上移动一行&#xff1b;l光标向后移动一个字符…...

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻&#xff01;&#xff01;&#xff01; 整数在内存中的存储 回忆知识&#xff1a;在讲操作符的那章节中&#xff0c;对于整数而言咱们讲过原码&#xff0c;反码和补码。整数分为有…...

【mysql面试题】mysql复习之常见面试题(一)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

VB.NET中如何利用ASP.NET进行Web开发

在VB.NET中利用ASP.NET进行Web开发是一个常见的做法&#xff0c;特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架&#xff0c;它允许开发者使用多种编程语言&#xff08;包括VB.NET&#xff09;来创建Web应用程序。以下是在VB.NET中…...

vue2+js项目升级vue3项目流程

Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有了显著的提升。升级到 Vue 3 可以让你的项目受益于这些改进。但是&#xff0c;升级过程也需要谨慎&#xff0c;因为涉及到代码的重构和潜在的兼容性问题。 1. 升级前的准备 备份项目&#xff1a; 在开始升级之前&#xff0c;…...

做EDM邮件群发营销时如何跟进外贸客户?

跟进外贸客户是外贸业务中至关重要的一环&#xff0c;需要耐心和策略。以下是一些建议&#xff0c;帮助你有效跟进外贸客户&#xff1a; 充分了解产品&#xff1a; 深入了解自己的产品&#xff0c;包括品质、价格竞争力、适用市场等。 只有对产品有充分的了解&#xff0c;才…...

【Java经典游戏】-01-是男人就坚持30秒

hello&#xff01;各位彦祖们&#xff01;我们又见面了&#xff01;&#xff01; 今天兄弟我给大家带来了一款经典趣味小游戏的项目案例-是男人就坚持30秒 本项目案例涉及到的技术&#xff1a; Java 语法基础Java 面向对象JavaSwing 编程Java 线程 是一个非常适合小白来加强…...

微调框QSpinBox

作用&#xff1a;允许用户按照一定的步长&#xff0c;来增加或减少其中显示的数值 有两种类型的微调框 QSpinBox - 用于整数的显示和输入QDoubleSpinBox - 用于浮点数的显示和输入 值 包括最大值、最小值、当前值 // 获取和设置当前值 int value() const void setValue(in…...

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef 1. AOSPXRef1.1. http://aospxref.com/android-14.0.0_r2/1.2. build/envsetup.sh 2. AndroidXRef2.1. http://androidxref.com/9.0.0_r3/2.2. build/envsetup.sh 3. HELLO AndroidReferences 1. AOSPXRef http://aospx…...

JavaScript substr() 方法

定义和用法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。 <script type"text/javascript">var str"Hello world!" document.write(str.substr(3))</script>lo world!<script type"text/javascript">v…...

教你把图片转换为炫酷的翻页电子杂志

​翻页电子杂志以其炫酷的视觉效果和便捷的阅读方式&#xff0c;受到了许多用户的喜爱。想要把普通的图片转换成这样的效果&#xff0c;其实并不复杂。下面&#xff0c;就让我来为您介绍一下如何操作。 首先&#xff0c;您需要准备一些基本的工具和材料。您需要一个图像编辑软件…...

生信软件35 - AI代码编辑器Cursor

1. Cursor - AI代码编辑器 Cursor的核心功能是利用生成式AI&#xff0c;帮助程序员通过自然语言描述快速生成代码。让程序员未来需要关注的是“做什么”&#xff08;What&#xff09;而不是“怎么做”&#xff08;How&#xff09;&#xff0c;即在使用AI生成代码的基础上&…...

Vue Router 编程式导航全攻略:深入掌握 push, replace, go, back, forward,beforeEach 方法

Vue Router 编程式导航全攻略&#xff1a;深入掌握 push, replace, go, back, forward,beforeEach 方法 在Vue Router中&#xff0c;编程式导航是一种通过JavaScript代码来实现路由跳转的方法。与声明式导航&#xff08;使用<router-link>标签&#xff09;相比&#xff…...

切换淘宝最新镜像源:优化NPM包管理的极致体验

在NPM生态系统中,快速、安全地获取所需的包是每个前端工程师追求的目标。然而,由于不同地区的网络环境,直接通过官方NPM仓库获取包可能会导致下载速度缓慢、超时等问题。针对这些情况,淘宝团队提供了优秀的NPM镜像源,并且定期更新。本文将详尽介绍如何切换淘宝最新镜像源,…...

react 基础语法

前置知识 类的回顾 通过class关键字定义一个类 类名首字母大写 class类有constructor构造器 new 一个类得到一个实例 类还有方法&#xff0c;该方法也会在其原型上 static静态数据&#xff0c;访问静态属性通过 类名.id getter和setter getter&#xff1a;定义一个属性&…...

k8s的NodeIP、PodIP、ClusterIP、ExternalIP

1.NodeIP K8s集群由Master Node与Worker Node组成。 Node&#xff1a;组成k8s集群的机器&#xff0c;可以是物理机或虚拟机。 Master Node &#xff1a;管理节点也叫控制平面主要负责管理控制方面。 Worker Node&#xff1a;&#xff1a;工作节点用于部署处理业务的工作负载或p…...

【vue element-ui】关于删除按钮的提示框,可一键复制

实现效果&#xff1a; Delete: function (id) {this.$confirm(此操作将永久删除该文件, 是否继续?, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning,center: true,}).then(() > {Delete(id).then(() > {this.$message({type: success,message: 删…...