数据结构之分文件编译学生管理
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入门 (二)控制语句
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分;希望通过我的知识点总结,能够帮助你更好地…...

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

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

CSS传统布局方法(补充)——WEB开发系列37
开发技术不断演进,布局方式也经历了多个阶段的变革。从最初的基于表格布局到 CSS 的浮动布局,再到今天的弹性盒(Flexbox)与 CSS Grid 网格布局,每一种布局方式都有其独特的背景和解决特定问题的优势。 一、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。它支持获取各种类型的数据,包括文本、JSON、图像和文件等。fetch API的主要优势之一是支持流式传输和取消请求,这使得处理大型数据集和长时间运行的操作变得更加简单和可靠。此外&…...

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

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

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

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

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

傅里叶变换的基本性质和有关定理
一、傅里叶变换的基本性质 1.1 线性性质 若 则 其中:a,b是常数 函数线性组合的傅里叶变换等于歌函数傅里叶变换的相应组合。 1.2 对称性 若 则 关于傅里叶变换的对称性还有 虚、实、奇、偶函数的傅里叶变换性质: 1.3 迭次傅里叶变换 对f(x,y)连续两次做二维傅里叶变换…...
VIM使用技巧
VIM使用技巧;VIM常用快捷键;vim常用命令;VIM常用快捷命令;vim使用技巧 VIM使用技巧 移动光标 hjkl,h光标向前移动一个字符的位置;j光标向下移动一行;k光标向上移动一行;l光标向后移动一个字符…...

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)
本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻!!! 整数在内存中的存储 回忆知识:在讲操作符的那章节中,对于整数而言咱们讲过原码,反码和补码。整数分为有…...
【mysql面试题】mysql复习之常见面试题(一)
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。以下是在VB.NET中…...
vue2+js项目升级vue3项目流程
Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有了显著的提升。升级到 Vue 3 可以让你的项目受益于这些改进。但是,升级过程也需要谨慎,因为涉及到代码的重构和潜在的兼容性问题。 1. 升级前的准备 备份项目: 在开始升级之前,…...
做EDM邮件群发营销时如何跟进外贸客户?
跟进外贸客户是外贸业务中至关重要的一环,需要耐心和策略。以下是一些建议,帮助你有效跟进外贸客户: 充分了解产品: 深入了解自己的产品,包括品质、价格竞争力、适用市场等。 只有对产品有充分的了解,才…...

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

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...