当前位置: 首页 > 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 线程 是一个非常适合小白来加强…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...