单链表(3)

news2024/12/29 9:55:41

现在有一个指针p,指向数据2所在的结点的地址——那么如何访问这个数据2

前面说过指针访问数据成员使用的是 指向符->。则访问这个数据2就是——p->data.因为p一开始就指向数据2的结点地址了

那么如何访问数据3,4往后等等

访问3就是——p->next->data

访问4就是——p->next->next->data

知道怎么访问了,现在从初始化开始

初始化还是——考虑到每一个数据成员

首先,头结点的数据域是不使用的。这里数据域不用管。        也有人把它制成0也可以,因为制成什么都不使用它,无所谓。

而指针next如果不管就成了一个不知道指向什么地方的野指针,所以要初始化——把next制成空NULL。

所以初始化做的就是上图的工作,让plist指向这样的一个头结点。

则初始化函数为

现在来测试一下初始化,还是老规矩写一个测一个

初始化通过,初始化完成我们就有了一个如图的头结点

现在来头插函数(牢记绑线原则,先后再前)——考试重点

例如现在要在数据1的前面插入一个数据100:

首先要给数据100申请一个新的结点

这里要用到动态内存的申请malloc,因为如果不是动态申请的,那在当前函数结束后,里面的就都释放没有了(这个函数执行完到下个函数,对于申请的东西还没用上没对其进行操作呢,申请的东西就没有了,申请了个寂寞),而动态内存则需要free才能释放。

之后把数据域value值100先给它放进去

然后将数据1往后挪移一位,将其原来的位置空出来,让新结点插入在其前面

插入就是先把后面的那条线绑起来,防止后面一长串的数据丢失,再把前面那条线绑起来,将新结点连接到整个链表中。

那要怎么申请这个动态结点——

就是一个指针p指向这个新结点,而这个指针p的类型——还是struct Node也就是Node*。所以动态申请就是Node*p=(Node*)malloc(sizeof(Node));括号里1*可以不写,因为malloc的默认返回类型是void*,所以记得强转成新结点的类型。

如何插入新结点——

第一种方法是先接前面plist的线,再接后面plist->next的线——但这种方法是不对的。

第一句话是把plist->next的值改成p的值800.

这时再让p->next的值等于plist->next的值时,plist->next的值前面已经改成了800,所以现在p—>next的值就是800.

现在头结点指向地址为800的结点,而地址800的结点还指向地址800.(800将500覆盖掉了)后面的那条线就断了。那从地址500开始往后的这些结点,数据就全丢了,再也找不见了。

改正的方法就是2句话换个先后位置,先连接后面那条线,再连接前面那条线。

这就是先连后面那条线,将p->next的值换成plist->next的值500,新结点就接上后面一长串数据了。

再连前面那个头结点,将plist->next的值换成p的值800.

完成后就是这样。

现在来测试一下:

首先编译通过了没出错,再来Show函数看一下

首先头插法——就是先插入的数据在后面,后插入的数据在前面

而show输出的数据是从plist->next的数据开始输出的,前面说了plist的数据域(plist->data)无效不用的,所以是plist->next->data为第一个。如果把打印输出的第一个数据写成plist->data,那么打印出来的第一个值就是一个随机值,负数多少。

所以指针p一定是初始化成plist的next。如果初始化成plist,就是上述错误。

但如果这么写,也就是你认为当p->next等于空了,就退出循环不打印了

然后测试一下就会发现,少打印了最先一个插入的数据0

当结果跟预设不一样时,可以下断点来调试。

0没有了,有2种情况,要不就是插入时没插入上;要不就是输出时没输出上。所以可以试着先把断点下在14行上,看一下0插入进去了没有。

首先逐语句,发现每条语句都执行了,函数走完一遍,第一个data数据0已经插入进去了。

先是第一步,插入值为多少。然后进入循环里面第一个i值0

现在进入头插函数

val值为0,断言plist不为空

然后是if

然后进入动态申请一个结点p

断言p不为空

val放入p的data

再绑后面的线

再绑前面的线

现在data0就已经插入进去了

现在就插入完成,即函数走完一遍了。p和plist->next的data现在都为0.

现在将断点改放在16行Show函数上,看是不是输出问题

最先打印的是数据19

进入Show函数

断言plist不为空

进入for循环,打印第一个值p->data:19

然后不停的点逐语句,让p->data打印的从19逐渐变到3,2,1,然后慢下来。例如下图就是打印数据2

然后是1,也打印了

接下来是数据0

但这里没有打印数据0,直接跳出循环了(一般是不符合循环条件了,从2跳出来的)

也就是p->next指向数据5的结点时,判断完条件直接跳出循环了,并没有执行printf语句输出这一步,也就是最后一个数据5没有打印。

现在分析出原因了,在p的next等于空的时候,p的data还要打印的,在打印完之后p=p->next都等于空了,才结束打印。所以应该是p!=NULL.

所以输出函数应该是

现在测试插入函数时,0就输出上了

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

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

相关文章

MFC-TCP网络编程客户端-Socket

目录 1、客户端创建流程: 2、UI设计: 3、代码实现: (1)、ConnectSocket中重写OnReceive函数接收信息 (2)、框架类入口函数初始化 (3)、加入房间功能实现 &#xff…

新闻稿大纲怎么写框架?纯干货

新闻稿大纲在新闻报道中的重要性不言而喻,首先大纲能够提高写作效率,有了一份详细的大纲,可以帮助我们迅速组织思路,梳理采访内容,明确文章的结构和主题,避免在写作过程中出现不必要的拖延。 其次&#xf…

数据结构之AVL树

map/multimap/set/multiset这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是普通的二叉搜索树有其自身的缺陷, 假如往树中插入的元素有序或者接近有序, 二叉搜索树就会退化成单支树, 时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖,但是一些编辑等操作的依赖是不支持的,如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

性能测试资源监控宝藏工具:iDB Dashboard

iDB Dashboard 是 TiDB 自 4.0 版本起提供的图形化界面,可用于监控及诊断 TiDB 集群。TiDB Dashboard 内置于 TiDB 的 PD 组件中,无需独立部署: https://docs.pingcap.com/zh/tidb/v4.0/dashboard-intro

【GEE】8、Google 地球引擎中的时间序列分析【时间序列】

1简介 在本模块中,我们将讨论以下概念: 处理海洋的遥感图像。 从图像时间序列创建视频。 GEE 中的时间序列分析。 向图形用户界面添加基本元素。 2背景 深水地平线漏油事件被认为是有史以来最大的海上意外漏油事件。该井释放了超过 490 万桶石油&am…

实用知识(工作中常用)

mybatis-plus联表查询 pom.xml坐标 <!-- mybatis-plus-join --> <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.2.4</version> </dependency>使用步骤&…

虚拟环境中使用的Python不是当前虚拟环境的,解决方法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 在虚拟环境中使用的python和pip不是虚拟环境的pip安装不到当前的虚拟环境中…等 解决方法 1. 解决办法 打开配置文件 vim ~/.bashrc把如下代码注释即…

Gradle笔记 三 Gradle的项目周期和settings 文件

文章目录 项目的生命周期settings 文件 项目的生命周期 Gradle 项目的生命周期分为三大阶段: Initialization -> Configuration -> Execution. 每个阶段都有自己的职责,具体如下图所示: ● Initialization 阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 I…

刚柔相济铸伟业 ——访湖南顺新金属制品科技有限公司董事长张顺新

时代在变&#xff0c;唯初心不改。 精致、谦虚、谨慎、儒雅、温和——他就是张顺新&#xff0c;湖南顺新金属制品科技有限公司、湖南顺新供应链管理有限公司董事长&#xff0c;民建长沙市委常委&#xff0c;民建湖南省环资委副主任&#xff0c;省、市民建企联会常务副会长&…

加速度jsudo:小企业会遇到哪些瓶颈期?

什么是瓶颈期&#xff1f;瓶颈期&#xff0c;就是你无论怎么努力&#xff0c;成绩都是上不去&#xff0c;还是停留在原地&#xff1b;而自己表现的还是很匆忙&#xff0c;却不知道如何下手&#xff1f;就像水桶效益一样&#xff0c;水桶的木板高度层次不齐&#xff0c;像极了自…

如何使用Leangoo领歌管理Sprint Backlog

什么是Sprint Backlog&#xff1f; Sprint Backlog是Scrum的主要工件之一。在Scrum中&#xff0c;团队按照迭代的方式工作&#xff0c;每个迭代称为一个Sprint。在Sprint开始之前&#xff0c;PO会准备好产品Backlog&#xff0c;准备好的产品Backlog应该是经过梳理、估算和优先…

STM32笔记—定时器

目录 一、TIM简介 二、基本定时器&#xff08;TIM6和TIM7&#xff09; 1. TIM6和TIM7简介 2. TIM6和TIM7的主要特性 3. TIM6和TIM7的功能 3.1 时基单元 3.2 计数模式 3.3 时钟源 三、通用定时器 1. TIMx(2、3、4、5)简介 2. TIMx主要功能 3. 时钟选择 4. 影子寄存器…

湖泊河道水质蓝藻浮漂监测案例

湖泊河道水质蓝藻浮漂监测案例 湖泊和河道的浮漂水质监测和蓝藻治理是现代城市环境管理的重要内容之一。随着人类社会的发展&#xff0c;水污染问题越来越严重&#xff0c;而湖泊和河道作为水资源的重要组成部分&#xff0c;其水质的变化和污染程度直接关系到人们的生命安全和…

qt+opengl 三维坐标系(三)

文章目录 前言一、深度测和投影矩阵、观察矩阵二、绘制坐标系三、添加箭头四、添加文字五、放大缩小六、旋转七、移动八、完整代码总结 前言 效果如图 一、深度测和投影矩阵、观察矩阵 这部分不明白&#xff0c;网上查的都是这个步骤&#xff0c;用起来也没问题。 void MOp…

avue 表单自定义标题无效问题(avue 表单自定义标题,当prop含有大写字母时失效)

问题描述&#xff1a; avue 表单自定义标题&#xff0c;官方文档可以生效&#xff0c;项目中不生效。多方排查发现&#xff0c;当prop含有大写字母时失效。 代码展示&#xff1a; <avue-form v-model"form" :option"option"><template #classN…

腾讯待办关停后,导出的ics文件怎么导入iPhone手机日历?

ics文件是一种通用日历格式保存的日历文件&#xff0c;不少提醒待办类软件支持导出ics文件&#xff0c;诸如大家所熟知的腾讯待办就支持导出成ics文件&#xff0c;腾讯待办的主要功能一待办事项和日程管理位置&#xff0c;设置好时间提醒后&#xff0c;可通过公众号端口弹出提醒…

c语言练习第10周(1~5)

根据公式求和 输入样例20输出样例 534.188884 #include<stdio.h> #include<math.h> int main() {int i,n;scanf("%d", &n);double s 0,t0;for (i 1; i < n; i) {t t sqrt(i);s s t;}printf("%.6lf", s);return 0; } 第一行输入…

STA——绪论

一、概述 静态时序分析&#xff08;简称STA&#xff09;是用来验证数字设计时序的技术之一&#xff0c;另外一种验证时序的方法是时序仿真&#xff0c;时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一&#xf…

uniapp H5预览PDF支持手势缩放、分页、添加水印、懒加载、PDF下载

效果预览 项目说明 uniapp vue2 node&#xff1a;v14.18.3 npm&#xff1a; 6.14.15 安装pdfh5.js插件 pdfh5 - npm (npmjs.com)pdfh5.js 基于pdf.js和jQuery pdfh5 - npm (npmjs.com) npm install pdfh5 由于我安装最新的pdfh5.js后运行时报错 所以我选择降低版本,可能是node…