当前位置: 首页 > news >正文

单链表(3)

现在有一个指针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就输出上了

相关文章:

  • 成绩公布方式,这样操作更方便
  • 十三、W5100S/W5500+RP2040树莓派Pico<FTP Server>
  • ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群
  • 论文阅读:Ensemble Knowledge Transfer for Semantic Segmentation
  • 阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可
  • VScode + opencv + c++ + win配置教程
  • 初识微服务技术栈
  • iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随
  • 如何在 Unbuntu 下安装配置 Apache Zookeeper
  • 一触即发!拓世法宝商业数字人一体机,化身数字员工,助你开拓连锁餐饮市场
  • 工程车云管家|叉车智能管家安卓主板方案
  • FPGA配置采集AR0135工业相机,提供2套工程源码和技术支持
  • 算法题:33. 搜索旋转排序数组(二分法)
  • sqli-labs-1
  • nacos配置中心docker部署、配置及 goLang 集成使用
  • 【译】JS基础算法脚本:字符串结尾
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 07.Android之多媒体问题
  • Centos6.8 使用rpm安装mysql5.7
  • Mysql数据库的条件查询语句
  • spring boot 整合mybatis 无法输出sql的问题
  • 工程优化暨babel升级小记
  • 后端_MYSQL
  • 首页查询功能的一次实现过程
  • 数据可视化之 Sankey 桑基图的实现
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • # Panda3d 碰撞检测系统介绍
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #微信小程序:微信小程序常见的配置传值
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (七)c52学习之旅-中断
  • (十八)三元表达式和列表解析
  • (十一)图像的罗伯特梯度锐化
  • (转载)利用webkit抓取动态网页和链接
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net 生成二级域名
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET中两种OCR方式对比
  • @Responsebody与@RequestBody
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [2]十道算法题【Java实现】
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]winform部署yolov5-onnx模型
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [CTO札记]如何测试用户接受度?
  • [Docker]五.Docker中Dockerfile详解
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)
  • [java/jdbc]插入数据时获取自增长主键的值
  • [MySQL]日期和时间函数