【数据结构】_以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.rhkb.cn/news/7539.html

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

相关文章

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意,此命令会启动一个新的容器,运行玩后会退出! Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…

Spring Data JPA 实战:构建高性能数据访问层

1 简介 1.1 Spring Data JPA 概述 1.1.1 什么是 Spring Data JPA? Spring Data JPA 是 Spring Data 项目的一部分,旨在简化对基于 JPA 的数据库访问操作。它通过提供一致的编程模型和接口,使得开发者可以更轻松地与关系型数据库进行交互,同时减少了样板代码的编写。Spri…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记:卓越强迫症强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的…

基于模糊PID的孵化箱温度控制系统(论文+源码)

1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统,其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成,通过温度传感器感应温度变化,获得待处理的数据…

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…

opengrok_使用技巧

Searchhttps://xrefandroid.com/android-15.0.0_r1/https://xrefandroid.com/android-15.0.0_r1/ 选择搜索的目录(工程) 手动在下拉框中选择,或者 使用下面三个快捷按钮进行选择或者取消选择。 输入搜索的条件 搜索域说明 域 fullSearc…

无人机如何自主侦察?UEAVAD:基于视觉的无人机主动目标探测与导航数据集

作者:Xinhua Jiang, Tianpeng Liu, Li Liu, Zhen Liu, and Yongxiang Liu 单位:国防科技大学电子科学学院 论文标题:UEVAVD: A Dataset for Developing UAV’s Eye View Active Object Detection 论文链接:https://arxiv.org/p…

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置,ansible工具功能配置。 ansible自身的配置文件…

git Bash通过SSH key 登录github的详细步骤

1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了,需要本地生成一个密钥,配置到gihub中才能使用 2 步骤 (1)首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…

矩阵的秩在机器学习中具有广泛的应用

矩阵的秩在机器学习中具有广泛的应用,主要体现在以下几个方面: 一、数据降维与特征提取 主成分分析(PCA): PCA是一种常用的数据降维技术,它通过寻找数据中的主成分(即最大方差方向&#xff09…

Windows Defender添加排除项无权限的解决方法

目录 起因Windows Defender添加排除项无权限通过管理员终端添加排除项管理员身份运行打开PowerShell添加/移除排除项的命令 起因 博主在打软件补丁时,遇到 Windows Defender 一直拦截并删除文件,而在 Windows Defender 中无权限访问排除项。尝试通过管理…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载:https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址:https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

计算机网络之应用层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 05 应用层 在网上看到其他人做了相关笔记,就不再多余写了,直接参考着学习吧。 王道考研 计算机网络笔记 第六章:应用层_王道考研 应用层 笔记-CSDN博客 DNS&#x…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

Pyecharts图表交互功能提升

在数据可视化中&#xff0c;交互功能可以极大地提升用户体验&#xff0c;让用户能够更加深入地探索数据。Pyecharts 提供了多种强大的交互功能&#xff0c;本篇将重点介绍如何使用缩略轴组件、配置图例交互&#xff0c;让我们的数据可视化作品更加生动有趣。 一、缩略轴组件使…

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…