dedecms 网站地图模板做竞品分析的网站

web/2025/9/25 23:07:57/文章来源:
dedecms 网站地图模板,做竞品分析的网站,电力建设期刊网站投稿,广东拟进一步规范临时用地管理目录 前言 一、链表的分类 二、双向循环链表 2.1 开辟新的节点 2.2 链表初始化 2.3 打印链表 2.4 链表的尾插 2.5 链表的头插 2.6 链表的尾删 2.7 链表的头删 2.8 查找链表 2.9 在pos位置之后插入数据 2.10 删除pos位置的数据 三、完整代码实现 四、顺序表和双向… 目录 前言 一、链表的分类 二、双向循环链表 2.1 开辟新的节点 2.2 链表初始化 2.3 打印链表 2.4 链表的尾插 2.5 链表的头插 2.6 链表的尾删 2.7 链表的头删 2.8 查找链表 2.9 在pos位置之后插入数据 2.10 删除pos位置的数据 三、完整代码实现 四、顺序表和双向链表的优缺点分析 总结 前言 我们之前讲了顺序表和单链表它们但是线性表的一种今天我们来讲链表中的双向循环链表。 一、链表的分类 链表的结构⾮常多样以下情况组合起来就有8种2 x 2 x 2链表结构 其中分为 虽然有这么多的链表的结构但是我们实际中最常⽤还是两种结构 单链表 和 双向带头循环链表 1. 无头单向非循环链表结构简单⼀般不会单独用来存数据。实际中更多是作为其他数据结 构的子结构如哈希图、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。 2. 带头双向循环链表结构最复杂⼀般⽤在单独存储数据。实际中使⽤的链表数据结构都 是带头双向循环链表。另外这个结构虽然结构复杂但是使用代码实现以后会发现结构会带 来很多优势实现反而简单了。 二、双向循环链表 我们之前讲了单链表今天我们来实现双向带头循环链表。 接口实现 //list.h//链表初始化 //void LTInit(LTNode** pphead); LTNode* LTInit();//打印链表 void LTPrint(LTNode* phead);//尾插 在最后有效节点或者哨兵位前插入都是尾插 void LTPushBack(LTNode* phead, LTDataType x);//头插 在第一个有效节点之前插入 void LTPushFront(LTNode* phead, LTDataType x);//尾删 void LTPopBack(LTNode* phead);//头删 void LTPopFront(LTNode* phead);//查找节点 LTNode* LTFind(LTNode* phead, LTDataType x);//在pos后面插入数据 void LTInsert(LTNode* pos, LTDataType x);//删除pos位置的数据 void LTErase(LTNode* pos);//销毁链表 保持接口一致性 //void LTDesTroy(LTNode** pphead);void LTDesTroy(LTNode* phead); 在实现代码前我们要先用结构体来定义链表的类型。由于是循环链表所以我们需要两个指针分别指向节点的前驱节点和后继节点。 typedef int LTDataType; //双向循环链表结构体类型 typedef struct ListNode {LTDataType data;struct ListNode* prev;//前驱节点struct ListNode* next;//后继节点 }LTNode; 2.1 开辟新的节点 在初始化之前我们来实现开辟新的节点 //新的节点 LTNode* LTBuyNode(LTDataType x) {//为新的节点开辟空间LTNode* newNode (LTNode*)malloc(sizeof(LTNode));if (newNode NULL) {perror(malloc fail!);exit(1);}newNode-data x;//让新节点头尾相连newNode-next newNode-prev newNode;return newNode; } 2.2 链表初始化 链表的初始化我们可以有两种写法 //写法一 传入头节点的地址 void LTInit(LTNode** pphead) {assert(pphead);//哨兵位*pphead LTBuyNode(-1); } //写法二 返回哨兵位,不传入值 LTNode* LTInit() {LTNode* pphead LTBuyNode(-1);return pphead; } 我们给哨兵位的值赋为-1(任意都可以哨兵位不作为有效数据)。 我们更推荐使用第二种方法因为保持接口的一致性。 2.3 打印链表 如果我们往链表中插入数据可以通过打印知道是否插入成功 void LTPrint(LTNode* phead) {assert(phead);//从哨兵位下一个节点开始打印LTNode* pcur phead-next;while (pcur ! phead) {printf(%d-, pcur-data);pcur pcur-next;}printf(\n); } 其中要注意的是循环开始是从哨兵位下一个节点开始的结束条件是pcur走到哨兵位即遍历了整个链表。 2.4 链表的尾插 void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);//要插入的新的节点LTNode* newNode LTBuyNode(x);//phead phead-prev newNodenewNode-next phead;newNode-prev phead-prev;phead-prev-next newNode;phead-prev newNode; } 尾插入一个节点我们要改变的是哨兵位哨兵位的前驱节点(即尾节点)新节点三个节点的指向 2.5 链表的头插 void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);//插入的新节点LTNode* newNode LTBuyNode(x);//phead phead-next newNodenewNode-next phead-next;newNode-prev phead;phead-next-prev newNode;phead-next newNode; } 头插入一个节点我们要改变的是哨兵位哨兵位的后继节点(即第一个有效数据节点)新节点三个节点的指向 2.6 链表的尾删 void LTPopBack(LTNode* phead) {assert(phead);//链表不为空assert(phead-next ! phead);//phead phead-prev-prev(prev) phead-prev(del)LTNode* prev phead-prev-prev;LTNode* del phead-prev;phead-prev prev;prev-next phead;free(del);del NULL; } 尾部删除一个节点我们要改变的是删除元素的前驱节点哨兵位的指向最后释放删除节点 2.7 链表的头删 void LTPopFront(LTNode* phead) {assert(phead);//链表不为空assert(phead-next ! phead);//phead phead-next(del) phead-next-next(next)LTNode* del phead-next;LTNode* next phead-next-next;phead-next next;next-prev phead;free(del);del NULL; } 头部删除一个节点我们要改变的是哨兵位删除节点的后继节点最后释放删除节点 2.8 查找链表 如果我们要指定位置插入或者删除我们就要找到这个位置我们进行链表的查找 LTNode* LTFind(LTNode* phead, LTDataType x) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead) {if (pcur-data x) {return pcur;}pcur pcur-next;}return NULL; } 如果存在返回当前节点不存在返回空。 2.9 在pos位置之后插入数据 void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newNode LTBuyNode(x);//newNode pos pos-nextnewNode-next pos-next;newNode-prev pos;pos-next-prev newNode;pos-next newNode; }我们要改变新节点pos节点pos节点的后继节点的指向。 注意我们要先把pos的后继节点的前驱节点指向新节点才能把pos的后继节点指向新节点不然反过来会找不到pos节点后继节点的位置。 2.10 删除pos位置的数据 //删除pos位置的数据 void LTErase(LTNode* pos) {assert(pos);pos-prev-next pos-next;pos-next-prev pos-prev;free(pos);pos NULL; } 我们要改变新节点pos节点的前驱pos节点的后继节点的指向。 2.11 销毁链表 因为每个节点都是单独开辟的空间所以我们要依次销毁。 //方法一 void LTDesTroy(LTNode** pphead) {assert(pphead);//哨兵位不能为空assert(*pphead);LTNode* pcur (*pphead)-next;while (pcur ! *pphead) {LTNode* next pcur-next;free(pcur);pcur next;}free(*pphead);*pphead NULL; } //方法二 void LTDesTroy(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead) {LTNode* next pcur-next;free(pcur);pcur next;}free(phead);phead NULL; } 与链表的初始化一样我们有两种方法但是我们一般选择第二种方法为了保持接口的一致性但是第二种方法我们要在函数外面手动给链表置为空。 三、完整代码实现 list.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h #includestdlib.h #includeassert.htypedef int LTDataType; //双向循环链表结构体类型 typedef struct ListNode {LTDataType data;struct ListNode* prev;//前驱节点struct ListNode* next;//后继节点 }LTNode;//链表初始化 //void LTInit(LTNode** pphead); LTNode* LTInit();//打印链表 void LTPrint(LTNode* phead);//尾插 在最后有效节点或者哨兵位前插入都是尾插 void LTPushBack(LTNode* phead, LTDataType x);//头插 在第一个有效节点之前插入 void LTPushFront(LTNode* phead, LTDataType x);//尾删 void LTPopBack(LTNode* phead);//头删 void LTPopFront(LTNode* phead);//查找节点 LTNode* LTFind(LTNode* phead, LTDataType x);//在pos后面插入数据 void LTInsert(LTNode* pos, LTDataType x);//删除pos位置的数据 void LTErase(LTNode* pos);//销毁链表 保持接口一致性 //void LTDesTroy(LTNode** pphead);void LTDesTroy(LTNode* phead); list.c #includelist.h//新的节点 LTNode* LTBuyNode(LTDataType x) {//为新的节点开辟空间LTNode* newNode (LTNode*)malloc(sizeof(LTNode));if (newNode NULL) {perror(malloc fail!);exit(1);}newNode-data x;//让新节点头尾相连newNode-next newNode-prev newNode;return newNode; }//链表初始化 //写法一 传入头节点的地址 //void LTInit(LTNode** pphead) { // assert(pphead); // 哨兵位 // *pphead LTBuyNode(-1); //} //写法二 返回哨兵位,不传入值 LTNode* LTInit() {LTNode* pphead LTBuyNode(-1);return pphead; }//打印链表 void LTPrint(LTNode* phead) {assert(phead);//从哨兵位下一个节点开始打印LTNode* pcur phead-next;while (pcur ! phead) {printf(%d-, pcur-data);pcur pcur-next;}printf(\n); }//尾插 void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newNode LTBuyNode(x);//phead phead-prev newNodenewNode-next phead;newNode-prev phead-prev;phead-prev-next newNode;phead-prev newNode; }//头插 void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newNode LTBuyNode(x);//phead phead-next newNodenewNode-next phead-next;newNode-prev phead;phead-next-prev newNode;phead-next newNode; }//尾删 void LTPopBack(LTNode* phead) {assert(phead);assert(phead-next ! phead);//phead phead-prev-prev(prev) phead-prev(del)LTNode* prev phead-prev-prev;LTNode* del phead-prev;phead-prev prev;prev-next phead;free(del);del NULL; }//头删 void LTPopFront(LTNode* phead) {assert(phead);assert(phead-next ! phead);//phead phead-next(del) phead-next-next(next)LTNode* del phead-next;LTNode* next phead-next-next;phead-next next;next-prev phead;free(del);del NULL; }//查找 LTNode* LTFind(LTNode* phead, LTDataType x) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead) {if (pcur-data x) {return pcur;}pcur pcur-next;}return NULL; }//在pos位置之后插入数据 void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newNode LTBuyNode(x);//newNode pos pos-nextnewNode-next pos-next;newNode-prev pos;pos-next-prev newNode;pos-next newNode; }//删除pos位置的数据 void LTErase(LTNode* pos) {assert(pos);pos-prev-next pos-next;pos-next-prev pos-prev;free(pos);pos NULL; }//销毁链表 /*void LTDesTroy(LTNode** pphead) {assert(pphead);//哨兵位不能为空assert(*pphead);LTNode* pcur (*pphead)-next;while (pcur ! *pphead) {LTNode* next pcur-next;free(pcur);pcur next;}free(*pphead);*pphead NULL; }*/ void LTDesTroy(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead) {LTNode* next pcur-next;free(pcur);pcur next;}free(phead);phead NULL; } listest.c #includelist.hvoid Listest() {//LTNode* plist NULL;//LTInit(plist);LTNode* plistLTInit();//尾插LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);//1 2 3 4;LTPrint(plist);//头插/*LTPushFront(plist, 8);LTPushFront(plist, 7);LTPushFront(plist, 6);LTPushFront(plist, 5);LTPrint(plist);*///尾删/* LTPopBack(plist);LTPrint(plist);LTPopBack(plist);LTPrint(plist);LTPopBack(plist);LTPrint(plist);LTPopBack(plist);LTPrint(plist);//删除失败链表为空//LTPopBack(plist);*///头删/*LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTPopFront(plist);LTPrint(plist);//删除错误链表为空//LTPopFront(plist);*///查找LTNode* retFInd LTFind(plist,1);/*if (retFInd) {printf(找到了\n);}else {printf(没找到\n);}*///在pos后面插入数据/*LTInsert(retFInd, 50);LTPrint(plist);*///删除pos位置上的数据/*LTErase(retFInd);LTPrint(plist);*///销毁链表//LTDesTroy(plist);//保持接口一致性LTDesTroy(plist);plist NULL; }int main() {Listest();return 0; }四、顺序表和双向链表的优缺点分析 不同点 顺序表 链表单链表 存储空间上 物理上⼀定连续 逻辑上连续但物理上不⼀定连续 随机访问 ⽀持O(1) 不⽀持O(N) 任意位置插⼊或删除元素 可能需要搬移元素效率低O(N) 只需修改指针指向 插⼊ 动态顺序表空间不够时需要扩 容 没有容量的概念 应⽤场景 元素⾼效存储频繁访问 任意位置插⼊和删除频繁 总结 上述文章我们讲了链表的双向带头循环链表的实现希望对你有所帮助

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

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

相关文章

网站建设不挣钱浏览器下载WordPress文件

1.错误复现 2.解决办法 2.1去https://github.com/Esri/resource-proxy 网站下载代理配置文件,我下载的是最新的1.1.2版本,这里根据后台服务器配置情况不同有三种配置文件,此次我用到的是DotNet和Java. 2.2 DotNet配置 2.2.1 对proxy文件增加…

宁波建站模板系统企业网站建设免备案

CSAPP学习 前言 一门经典的计组课程,我却到了大四才学。 anyway,何时都不会晚。 博主参考的教程:本电子书信息 - 深入理解计算机系统(CSAPP) (gitbook.io),非常感谢作者的整理。 诚然去看英文版可以学…

网站app开发费用网站建设网络推广方案

水果店微信小程序:新鲜生活,触手可及 在这个快节奏的时代,我们都在追求更高效、更便捷的生活方式。而微信小程序,正是这样一个让生活变得更加轻松便捷的神奇工具。今天,我要向大家介绍的,就是一家独具匠心…

厦门网站快速排名优化开平网站建设

简介hexo —— 简单、快速、强大的Node.js静态博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 特性风一般的速度Hexo基于Node.js,支持多进程,几百篇文章…

购物商城网站开发腾讯云获取WordPress密码

写在前面在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率。今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和索引下推索引覆盖要了解索引覆…

赤壁网站设计php做网站时间代码

声明 本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负! 如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦! 前言 目标网站:aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRm…

host域名主机服务商商务企业网站模板瑞安网站开发

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述,我们知道aggregate()方法返回的数据集的形状(shape)与被分组的数据集的形状是不同的…

如何将网址提交到一些权重比较高的网站wordpress 去除评论框

注解是什么? 注解可以理解成注释、标记、标签的意思,用来标记类、方法等。就相当于现实生活中的一些事物,上边贴一个标签或者写一些注释性文字来描述它可以用来做什么、怎么用、何时用等信息。Java中的注解也是一样的,用来表示被标…

广告设计就业方向和前景南昌网站建设方案优化

文章目录1. 逻辑回归二分类2. 垃圾邮件过滤2.1 性能指标2.2 准确率2.3 精准率、召回率2.4 F1值2.5 ROC、AUC3. 网格搜索调参4. 多类别分类5. 多标签分类5.1 多标签分类性能指标本文为 scikit-learn机器学习(第2版)学习笔记逻辑回归常用于分类任务 1. 逻…

seo网站设计团购网站案例

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉! 9月份,空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示,今年9月,京东平台空气净化器的销量将近15万,同比增长约1%;销售额将近2亿元&…

政务公开网站建设整改方案手机在网上怎么创建自己的网站

问题: 级数敛散性和积分敛散性的区别联系是什么?学习的目的是什么?最重要的目的是什么? 主要内容。 部分和 s ∑ i 1 n u i s \sum_{i1}^{n} u _{i} si1∑n​ui​ 注意:部分和不是数列的一部分之和,…

黄埔做网站公司it外包企业排名

方差可以反应变量的离散程度,是因为它度量了数据点与均值的差异。方差是每个数据点与均值的差的平方和的平均值,它可以反映数据点在均值附近的分布情况。如果方差较小,说明数据点更加集中在均值附近,离散程度较小;如果…

中山企业建网站wordpress无法缩进

云服务器可以装多个系统吗 内容精选换一换示例:购买并登录Windows弹性云服务器示例:购买并登录Linux弹性云服务器云平台提供了多种实例类型供您选择,不同类型的实例可以提供不同的计算能力和存储能力。同一实例类型下可以根据CPU和内存的配置…

教做视频的网站建产品网站怎么做

每个JJ Abrams的电视连续剧疑犯追踪从主要人物芬奇先生一个下列叙述情节开始:“ 你是被监视。 政府拥有一个秘密系统-每天每天每小时都会对您进行监视的机器。 我知道是因为...我建造了它。 “当然,我们的技术人员知道得更多。 庞大的电气和软件工程师团…

网站域名如何起网站素材站

程序员不仅拥有将抽象概念转化为实际应用的能力,还通常具备强大的逻辑思维和问题解决能力。然而,许多程序员并不满足于仅仅在一家公司工作,他们渴望通过副业来实现个人价值的最大化,增加收入,甚至探索自己的创业梦想。…

网站内部优化做静态网站选用什么服务器

9.3.3 内连接(INNER JOIN) 内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的…

网站建设建站网易互客网站建设怎么做帐

建立时间和保持时间的模型分析 起点是源触发器D1的采样时刻,终点是目的触发器D2的采样时刻,假设起点已经满足了建立时间和保持时间要求,现在分析终点采样时刻是否同样满足要求。 其中 Tco:数据正确采样后从D端到达Q端的延时,触发器固有属性,不可改变。TDelay:D1输出端…

昆明c2c网站建设苏州市网站

未完待续...T1:牛牛的方程式titlesolutioncodeT2:牛牛的猜数游戏titlesolutioncodeT3:牛牛的凑数游戏titlesolutioncodeT1:牛牛的方程式 title solution 因为浮点错误炸了70pts 这个三元一次不定方程呢,其实也没有…

网站做境外第三方支付关于申请建设网站申请报告

题干: 给出一个n1个点的树,以及p个点对,需要断开一些点,使得这p个点对路径不连通。输出应该断开的最少点数。 解题报告: 从那p个点对入手的话:首先考虑只有一对点的话,肯定是这条路径上的随便…

微博营销网站服务器维护要多久

冒泡排序 冒泡排序是一种 稳定 的排序算法。 它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时,排序就完成了。 假设我们想要从小到大进行排序&#…