网站开发 网络工程 哪个好焦作建设企业网站公司

diannao/2026/1/16 1:58:21/文章来源:
网站开发 网络工程 哪个好,焦作建设企业网站公司,建筑招工信息网,绍兴柯桥建设局网站文章目录什么是链表为什么不用结构体数组链表的操作创建表删除元素插入元素代码及运行结果什么是链表 链表是数据结构里面的一种#xff0c;线性链表是链表的一种#xff0c;线性链表的延伸有双向链表和环形链表。在编程语言中优化数据结构可以在处理大数据时大大降低程序的… 文章目录什么是链表为什么不用结构体数组链表的操作创建表删除元素插入元素代码及运行结果什么是链表 链表是数据结构里面的一种线性链表是链表的一种线性链表的延伸有双向链表和环形链表。在编程语言中优化数据结构可以在处理大数据时大大降低程序的空间复杂性和时间复杂性。这里我只用一个简单的例子——线性单向链表为例说明C语言是如何实现该结构的。 链表的元素是由结构体来实现struct table *p。结构体中有一个成员是结构体指针struct table *next而这个结构体指针的类型和此结构体类型相同。除链表最后一个元素外每一个结构体的指针都指向链表中下一个元素的结构体最后一个元素的结构体指针为空(NULL)。保存链表时只需要记录下链表的头指针即链表中第一个结构体的地址即可。添加一个链表元素时都需要单独申请一段内存删除时则将其释放掉。在查找链表时只需要顺着结构体指针的顺序一个一个往下查找直到查找的结构体中的成员指针。以下是一个链表结构的示意 struct Student{ int ID;//学号 char[20];//姓名 int marks[5];//5门考试的成绩 struct Student *next;//指向下一个结构体的结构体指针 }为什么不用结构体数组 有人会有问为什么不直接用一个结构体数组代替链表结构体数组占据的内存空间是连续的如果使用malloc指令一样可以动态存储而且连续的内存空间肯定比不确定的内存空间效果要好。但是如果对一个动态数组插入或者删除元素的话它后面的所有元素都需要变动位置因此修改数组会比链表要难的多。但它的优点在于查找方式很灵活每一个元素相对于数组首元素地址都有一个偏移量i因此对于数组来说既可以顺向查找也可以反向查找还可以二分法查找。 由于链表的每一个元素都有一段内存这些内存未必是连续的加上链表本身会比结构体数组多一个指向下一个元素的结构体指针因此从节省内存的角度看链表是不如数组的。但是链表删除元素的时候(假设这个元素是a[k])只需要a[k-1]的next指针指向a[k1]再把a[k]的内存释放即可非常方便插入元素的时候(假设这个元素是a[n])只需要a[n-1]的next指针指向a[n]再将a[n]的指针指向a[n1]即可相比于数组来说只修改了两个元素速度快而且非常方便。 链表的操作 链表的操作分为——创建表、插入元素、删除元素、清空表、查找表、打印表。其中插入/删除的元素可以是一个也可以说多个。链表从存储类型上来分可以分为静态链表和动态链表静态链表是事先编写好的链表占用的内存是静态存储区的内存使用时不可以对其中的元素进行删减只能查找动态链表是按照程序要求生成的链表存放于动态存储区结构比较灵活每一个元素都占据一部分存储空间如果要删除元素则释放该位置的内存如果要添加元素则申请一个结构体内存区的内存。 创建表 创建链表需要两个指针一个作为先行指针(*p1)开辟内存并保存结构体的值;一个作为缓存指针(*p2)保留先行指针的所有值并且将它的next指向先行指针。构建链表时先行指针赋一个值后行指针保存一个值并且后行指针的next指向先行指针。赋值终止时先行指针的next指向NULL同时将先行指针赋值给后行指针链表即构建完毕 代码窗口可以通过键盘的←和→查看。 struct Student * input() {struct Student *p1,*p2,*headNULL; printf(************************动态链表实验***********************\n【输入动态链表】\n);printf(请依次输入学号 姓名 身高(cm) 体重(kg)用空格间隔学号输入0结束:\n);p2p1(struct Student *)malloc(LEN);//开辟内存 scanf(%d %s %f %f,p1-ID,p1-name,p1-height,p1-weight);if(p1-ID0)return(head);else headp1;while(p1-ID!0){p2-nextp1;p2p1;p2-BMI(float)p2-weight/(p2-height/100)/(p2-height/100);//求BMI指数 p1(struct Student *)malloc(LEN);//开辟内存 scanf(%d %s %f %f,p1-ID,p1-name,p1-height,p1-weight);}p2-nextNULL;return(head);//返回链表头指针 }删除元素 删除元素链表的第n个元素只需要将第n-1个元素的next指针指向第n1个元素再将第n个元素的内存释放即可,我这里是写的其中一个例子根据关键字学号int stdID删除表中的某个元素同时返回删除后的链表首地址如果删的是第一个元素则链表首地址会变 代码窗口可以通过键盘的←和→查看。 struct Student *delate(struct Student *head,int stdID) {struct Student *p1,*p2;if(head-IDstdID){p1head-next;free(head);return p1;}//如果删除的是第一个元素比较特殊需要修改头指针其余不动//剩余几种情况都是修改next结构体指针 for(p1head;p1!NULL;p2p1,p1p1-next)//p1指针和p2指针同时查找,p1指向当前的学生p2保指向了上一个学生 {if(p1-IDstdID){p2-nextp1-next;//假设找到了需要删除的学生的学号则让它上一个学生的指针指向跳过他的下一个学生 free(p1);return head; }}return NULL;//返回NULL代表没找到 }插入元素 插入元素的原理是假设要在第n个元素前插入一个元素。首先判断它是不是首元素如果是则修改头指针指向该元素并将该元素的next指向原来的头指针。如果不是首元素是第k个元素之前插入一个元素则将第k-1个元素的next指针指向插入元素或者子表的地址或者头指针将插入元素的next指针或尾指针指向第k个元素。本示例代码是根据一个学号主要关键字插入一个元素或者子表的函数返回链表的首地址因为如果在第一个元素前面插入可能改变链表的首地址。 代码窗口可以通过键盘的←和→查看。 struct Student *insert(struct Student *head,int stdID,struct Student *insertstd) {struct Student *p1,*p2,*p;for(pinsertstd;p-next!NULL;pp-next);//找到insert链表的最后一个元素 if(head-IDstdID){p-nexthead;return insertstd;}for(p1head;p1!NULL;p2p1,p1p1-next){if(p1-IDstdID){p2-nextinsertstd;p-nextp1;return head; }}return NULL; }代码及运行结果 完整代码及注释如下 代码窗口可以通过键盘的←和→查看。 #include stdio.h #include malloc.h #include stdbool.h #define LEN sizeof(struct Student)//定义结构体变量的大小为符号常量LEN struct Student{int ID;//学号 char name[20];//姓名 float height;//身高 float weight;//体重float BMI;//BMI指数录入时不需要计算 struct Student *next;//指向下一个结构体 }; struct Student *input();//输入函数 void output(struct Student * head);//输出函数 struct Student *delate(struct Student *head,int stdID);//删除一个元素返回删除后表的头指针 struct Student *insert(struct Student *head,int stdID,struct Student *insertstd);//返回插入元素子表后的头指针 int append(struct Student *head);//插入一个链表从input函数输入 struct Student *isexist(struct Student *head,int stdID); int main() {struct Student *present;//当前链表的头指针 int choice;bool next;int stdID;/* 1插入一个元素2删除一个元素3续表 4查找表 */ printf(**********动态链表实验**********\n初始化一个链表\n);presentinput();//当前的链表指针do{printf(请选择:\n|1插入元素(子表)\n|2删除元素\n|3续表\n|4查找表\n);scanf(%d,choice); switch(choice) {case 1:printf(请输入插入地点的后一个同学的学号: );scanf(%d,stdID);if(isexist(present,stdID)NULL){printf(该学生不存在!\n);break;//退出switch语句 }presentinsert(present,stdID,input());printf(插入元素后的链表为:\n); output(present);break;case 2:printf(请输入删除元素的学号: );scanf(%d,stdID);if(isexist(present,stdID)NULL){printf(该学生不存在!\n);break;//退出switch语句 }presentdelate(present,stdID);printf(删除后的链表为:\n); output(present);break;case 3:append(present);printf(续表后的链表为\n);output(present);break;case 4:printf(当前链表为\n); output(present);break;}printf(是否继续(Yes:1,No:0): );scanf(%d,next);fflush(stdin);}while(next);return 0; } struct Student * input() {struct Student *p1,*p2,*headNULL; printf(************************动态链表实验***********************\n【输入动态链表】\n);printf(请依次输入学号 姓名 身高(cm) 体重(kg)用空格间隔学号输入0结束:\n);p2p1(struct Student *)malloc(LEN);//开辟内存 scanf(%d %s %f %f,p1-ID,p1-name,p1-height,p1-weight);if(p1-ID0)return(head);else headp1;while(p1-ID!0){p2-nextp1;p2p1;p2-BMI(float)p2-weight/(p2-height/100)/(p2-height/100);//求BMI指数 p1(struct Student *)malloc(LEN);//开辟内存 scanf(%d %s %f %f,p1-ID,p1-name,p1-height,p1-weight);}p2-nextNULL;return(head);//返回链表头指针 } void output(struct Student *head) {struct Student *p;int num1;phead;//将头指针地址传给p printf(【输出动态链表】\n);printf(|学号\t\t|姓名\t|身高\t|体重\t|BMI\n);while(p!NULL){printf(%3d|%08d\t|%s\t|%5.2f\t|%5.2f\t|%lf\n,num,p-ID,p-name,p-height,p-weight,p-BMI);pp-next;} } struct Student *delate(struct Student *head,int stdID) {struct Student *p1,*p2;if(head-IDstdID){p1head-next;free(head);return p1;}//如果删除的是第一个元素比较特殊需要修改头指针其余不动//剩余几种情况都是修改next结构体指针 for(p1head;p1!NULL;p2p1,p1p1-next)//p1指针和p2指针同时查找,p1指向当前的学生p2保指向了上一个学生 {if(p1-IDstdID){p2-nextp1-next;//假设找到了需要删除的学生的学号则让它上一个学生的指针指向跳过他的下一个学生 free(p1);return head; }}return NULL;//返回NULL代表没找到 } struct Student *insert(struct Student *head,int stdID,struct Student *insertstd) {struct Student *p1,*p2,*p;for(pinsertstd;p-next!NULL;pp-next);//找到insert链表的最后一个元素 if(head-IDstdID){p-nexthead;return insertstd;}for(p1head;p1!NULL;p2p1,p1p1-next){if(p1-IDstdID){p2-nextinsertstd;p-nextp1;return head; }}return NULL; } int append(struct Student *head)//插入一个链表从input函数输入 {struct Student *p;for(phead;p-next!NULL;pp-next);//找到head链表的最后一个元素 p-nextinput();//从input输入需要添加的元素可以是1个或者多个return 0; } struct Student *isexist(struct Student *head,int stdID) {struct Student *p;for(phead;p!NULL;pp-next){if(p-IDstdID){return p;}}return NULL; }输出效果如下图 希望本文对您有价值谢谢阅读。

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

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

相关文章

网站建设 项目文档阿里巴巴国际站运营教程

前言 现在已经进入招聘季节,本篇文章旨在分享知名互联网企业面试官面试方法和心得,希望通过本文的阅读能给程序员带来不一样的面试体验和感受,放松面试心态,积极备战! 面试题 PS:由于文章篇幅问题&#x…

wordpress网站的配置文件权重查询工具

行为型设计模式是面向对象编程中的一种模式,它关注的是对象之间的通信和协作,以实现特定的行为或任务。这些模式通常涉及到对象之间的消息传递、方法调用和协同工作,以达到更好的灵活性和可维护性。 行为型模式用于描述程序在运行时复杂的流程…

如何创建个人网站赚钱东营网站设计制作

这篇文章将总结Spring Integration(SI)的重要要点以及消息传递集成模式。 对于每个关键提示,我都会根据我的经验添加一个真实的示例。 分离器 一个。 它能做什么? 拆分器实际上是一种模式,它在某一点接收一条消息并将…

网站建设需要注意哪些问题网络营销的职能是什么?

现状分析 项目的需求用到编辑器,编辑器中又可能用到图片上传功能。 实现方案 1. 增加依赖库,可以参考前面的几篇文章,都有描述。 2. 核心代码实现 PictureSelector.create(GoodItemContentFragment.this) .openGallery(SelectMimeType.…

英语培训网站模板千库网素材官网

开发JSP自定义标记 您已经学习了如何用JavaBean处理JSP页面的业务逻辑。除此以外,您还可以用自定义标记处理JSP应用程序中反复出现的业务逻辑要求。 tag是程序中使用的执行重复性任务的可重用单元。例如, 是使主体文本在网页中间出现的HTML标记。JSP可用于创建于XML标记类似…

网站搭建学什么专业公司网站建设预算

​魔女司教和魔女的能力一点关系都没有,而且魔女教一开始是正常的,直到艾米莉亚父母死后才出现各种大罪司教发疯,怠惰是艾米莉雅的养父,艾米莉亚一族守护的封印被虚饰魔女入侵,怠惰为了守护强行融合了魔女基因&#xf…

古典风格网站模版怎么看网站建设

------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,这节课带来k8s的流量入口ingress,作为业务对外服务的公网入口,它的重要性不言而喻,大家一定要仔细阅读,跟着博哥的教程一步步实操去理…

门户网站都有哪些技术支持 东莞网站建设 轴承

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

江苏企业网站制作哪家好企业网站关键词优化排名应该怎么做

我告诉你什么事最可悲,你遇见一个人,犯了一个错,你想弥补想还清,到最后才发现,你根本无力回天,犯下的罪过永远无法弥补转载于:https://www.cnblogs.com/ting6/p/9726163.html

昆明网站建设哪个公司好网站建设评估体系

提到registry v2,主要改进是支持并行pull镜像,镜像层id变成唯一的,解决同一个tag可能对应多个镜像的问题等等。如果还不太了解,可以且听我细细道来。首先不得不说的是v2 新加了一个概念Digest他是基于内容进行寻址(Content-addres…

怎么做搜索网站网站建设方案书0

可能出现的问题:*个人电脑上遇到不能collect memery的情况,是电脑内存较少,建议分成用2G左右的数据进行组装。* Seed.fasta #用于起始组装的种子序列,NOVOPlasty安装软件目录下有这个文件,就叫这个名字,作者…

html网站模板 淘宝商城网站建设注意哪些方面

2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 题目配置步骤在DC1服务器上安装证书颁发机构。定义名称:CSK2023-ROOTCA。证书颁发机构有效期:3 years。为chinaskills.com域内的web站点颁发web证书。当前拓扑内所有机器必须信任该…

京东的网站是怎么建设的毕业ppt模板免费下载

写点东西《JWT 与会话身份验证》 身份验证与授权 JWT 与session身份验证 - 基本差异 什么是 JWT? JWT 结构: JWT 工作流程:优势: 安全问题: 处理令牌过期: 基于session的身份验证(通常称为基于 cookie 的身…

山东高端网站建设方案网站开发助手

有一些朋友问我teams是否支持将其他平台/系统里的聊天记录迁移某个channel里,答案是肯定的,teams团队在去年年中的时候就提供了这个功能。这个功能是通过graph api来完成的,我们今天就来看看如何迁移聊天记录到teams里。 首先,我…

工信部网站备案管理系统学而思网校官网

子串简写 代码 kint(input()) s,c1,c2input().split() pre[0]*len(s) ans0 for i in range(len(s)):pre[i]pre[i-1]if c1s[i]:pre[i]1elif c2s[i] and i1-k>0:anspre[i-k1] print(ans)

遵义在线网站建设搜索引擎优化的方法包括

1 问题描述 有时代码提交修改的文件比较多,当查看log时无法显示出来修改的文件列表,如下所示: 2 解决方法 将LogTooManyItemsThreshold尽可能配置得大一些。 三 参考资料 https://gitlab.com/tortoisegit/tortoisegit/-/issues/3878

怎么做查询网站后台网站建设费 开办费

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目 希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一、绪论 1. 研究背景 现在大家…

手机网站建设哪建模师工资一般多少

问题描述 之前一直用的gitee协同协作,然后再最近一次云计算项目中团队使用的是github进行协作,但是按照常规步骤再GitHub上配置了ssh密钥后,却依然显示连接失败,无法推送和拉取代码,克隆仓库也是报错拒绝。具体报错信…

阿里云空间做的网站不收录关键词竞价排名名词解释

1.存储器和cache 存储器的容量、速度与价格之间的要求是相互矛盾的,速度越快,没bit位价格越高,容量越大,速度越慢,目前主存一般有DRAM构成。 处理器CPU访问存储器的指标: 延迟时间(Latency&am…

贵州建设厅网站怎样查询电工证山西临汾建设局网站

归约操作java81.简介 在上一篇文章中 ,我写了关于如何使用流和分组对对象集合进行分组的文章。 这很有用,但不涵盖特定的用例。 例如,有时我们不仅需要对事物进行分组,还需要将结果转换为更合适的对象。 在这篇文章中&#xff0c…