【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录

1. 第一版代码

2. 第二版代码

3. 第三版代码


前文已介绍无头单向不循环链表的实现,详见下文:

【数据结构】_不带头非循环单向链表-CSDN博客

但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了二级结构体指针类型。

本文以尾插为例,分析单链表的二级指针传参方法的实现逻辑。

1. 第一版代码

当参数为一级指针时,phead用于接收实参传递的链表结点指针:

void SLTPushBack(SLTNode* phead, SLTDataType x) {SLTNode* newNode = CreatSLTNode(x);SLTNode* cur = phead;while (cur->next) {cur = cur->next;}cur->next = newNode;
}

考虑链表为空的情况:

当链表为空(即没有链表结点)时,头指针phead为空,用于遍历结点的指针pcur也被赋值为空,对于遍历找尾时的while (cur->next)需要对cur进行解引用,此时就会出错,故需单独对链表进行判空操作

2. 第二版代码

void SLTPushBack(SLTNode* phead, SLTDataType x) {SLTNode* newNode = CreatSLTNode(x);// 空链表if (phead == NULL) {phead = newNode;}else {// 非空链表SLTNode* cur = phead;while (cur->next) {cur = cur->next;}cur->next = newNode;}
}

编写测试函数:

void Test2() {SLTNode* plist = NULL;SLTPushBack(plist, 1);SLTPrint(plist);
}

 调用后,运行结果如下:

调试发现:当SLTPushBack执行结束后,形参的phead值按照预想被成功赋值,而实参plist并未发生改变:

这就是传值调用的问题:采用与形参同类型的形参来接收实参,在函数内可实现形参的改变,但无法改变实参。

需要改变一级结构体指针型变量plist,则需使用传址调用,故而SLTPushBack的参数除结点数据x外,另一个参数需为二级结构体指针变量:SLTNode** pphead

3. 第三版代码

将SLTPushBack的参数变更为SLTNode** pphead后,对比以下3个变量*plist、plist、&plist如下:

(1)*plist:第一个结点;

(2)plist = *pphead:指向第一个结点的指针;

(3)&plist = pphead:指向第一个结点的指针的地址;

void SLTPushBack(SLTNode** pphead, SLTDataType x) {assert(pphead);SLTNode* newNode = CreatSLTNode(x);// 空链表if (*pphead == NULL) {*pphead = newNode;}else {// 非空链表SLTNode* cur = *pphead;while (cur->next) {cur = cur->next;}cur->next = newNode;}
}

同时请注意,由于需对pphead进行解引用操作,故需保证pphead不为空,加断言即可; 

此时再调用测试函数,运行结果如下:

注:1、本文仅是做具体分析,在实际编写方法时仅需考虑该操作是否涉及实参值的改变,就可判断出到底需要传值还是传址。

对于单链表来说,由于测试时首先创建了一个结构体指针变量plist,令其指向单链表的头结点,并且plist会作为实参。

故而判断其方法是否需要传二级指针,只需考虑该方法是否可能导致链表的头结点发生替换(即头结点指针是否会发生变化)

(1)对于头插、指定位置插入、头删、尾删、指定位置删除等方法都需使用二级指针,因为可能会令新插入的结点作为头结点,或是删除了原本是头结点的结点

(2)对于指定位置插入、指定位置删除都无需使用二级指针,因为并不会导致链表头结点指针的变化

2、关于传值调用与传址调用,在C语言的指针部分已有过相关介绍:

【C语言】_传值调用与传址调用_c语言选址调用-CSDN博客文章浏览阅读275次,点赞8次,收藏4次。1、传址调用可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;但实参a与形参x,实参b与形参y的地址并不相同,即各自占用其内存空间,可见虽然形参x接收了实参a的值,形参y接收了实参b的值;使用tmp交换x与y并不能实现a与b的交换;_c语言选址调用https://blog.csdn.net/m0_63299495/article/details/144946598https://blog.csdn.net/m0_63299495/article/details/144946598https://blog.csdn.net/m0_63299495/article/details/144946598只是当参数类型较为复杂,尤其是实参为指针类型变量时,可能会忽略或混淆传值调用与传址调用的相关判断。

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

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

相关文章

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…

Android - 通过Logcat Manager简单获取Android手机的Log

由于工作需要,经常需要获取Android手机的Log。 平常都是通过adb命令来获取,每次都要写命令。 偶然的一个机会,我从外网发现了一个工具 Logcat Manager,只需要通过简单的双击即可获取Android的Log,这里也分享一下。 目…

c++学习第十三天

创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。 提示:以下是本篇文章正文内容,下面案例可供参考 一、vector 1.介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理,我们知道任意一个大于1的自然数可以表示为一些质数的乘积: LeetCode 2521: 给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。 注意: 质数 是…

docker-compose Zookeeper 集群搭建

文章目录 前言docker-compose Zookeeper 集群搭建1. Zookeeper下载2. 制作Dockerfile文件3. 构建镜像4. docker-compose 管理5. docker-compose构建/启动6. 验证6.1 docker ps6.2 使用 zkCli.sh 连接并验证集群 前言 如果您觉得有用的话,记得给博主点个赞&#xff0…

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制

近日,一个新的UEFI漏洞被发现,可通过多个系统恢复工具传播,微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明,该漏洞能让攻击者绕过安全启动机制,并部署对操作系统隐形的引导工具包。 据TomsH…

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…

【数据结构】 并查集 + 路径压缩与按秩合并 python

目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合,每个集合用一棵树表示,树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点,那么它就是该集合的代…

低代码系统-产品架构案例介绍、得帆云(八)

产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台,区别于阿里云、腾讯云 Dehoop 指…

【PyTorch】5.张量索引操作

目录 1. 简单行、列索引 2. 列表索引 3. 范围索引 4. 布尔索引 5. 多维索引 个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为…

基于微信小程序高校课堂教学管理系统 课堂管理系统微信小程序(源码+文档)

目录 一.研究目的 二.需求分析 三.数据库设计 四.系统页面展示 五.免费源码获取 一.研究目的 困扰管理层的许多问题当中,高校课堂教学管理也是不敢忽视的一块。但是管理好高校课堂教学又面临很多麻烦需要解决,如何在工作琐碎,记录繁多的情况下将高校课堂教学的当前情况反…

论文阅读笔记:VMamba: Visual State Space Model

论文阅读笔记:VMamba: Visual State Space Model 1 背景2 创新点3 方法4 模块4.1 2D选择性扫描模块(SS2D)4.2 加速VMamba 5 效果5.1 和SOTA方法对比5.2 SS2D和自注意力5.3 有效感受野5.4 扫描模式 论文:https://arxiv.org/pdf/240…

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…

DBO-高斯回归预测matlab

蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法,在2022年底提出,主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 本次研究使用的是 Excel 格式的股票预测数据。数据集按照 8:1:1 的比例&#x…

java后端之事务管理

Transactional注解:作用于业务层的方法、类、接口上,将当前方法交给spring进行事务管理,执行前开启事务,成功执行则提交事务,执行异常回滚事务 spring事务管理日志: 默认情况下,只有出现Runti…

【嵌入式】总结——Linux驱动开发(三)

鸽了半年,几乎全忘了,幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的,本篇与前两篇一样,重点在于使用、快速体验,uboot、linux、根文件系统不作深入理解,能用就行。 重新梳理一下脉络,本…

RabbitMQ 多种安装模式

文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包:2、…

使用python-docx包进行多文件word文字、字符批量替换

1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字,安装。 4、新建py文件,写程序。 from docx import Documentdef replace1(array1):# 替换词典(标签值按实际情况修改)dic {替换词1: array1[0], 替换…

Android中Service在新进程中的启动流程

目录 1、Service与AMS交互框架介绍 1.1、认识AMS代表IActivityManager 1.2、认识客户端代表IApplicationThread 2、Service启动流程概览 我们知道Android有四大组件,Activity、Service、ContentProvider、Broadcast,每个组件在系统运行中或者我们编写…