单链表---对传参为双指针的理解

news2024/12/23 20:20:26

​​​​​​​​​​​

 

上一篇中我们提到了单链表头指针的创建

           如果链表为空时,头指针为NULL。接下来要实现节点的插入和删除。

           在链表头部插入新节点,因此头指针指向的地址也应发生改变,即指向新节点的地址,因为在此时新节点就是头节点。此时我们就该考虑传参的问题。

                    我们先来看头指针是如何创建的

#include<stdio.h>
typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;
int main() {
	SListNode* plist = NULL;
	return NULL;
}

                              此处的plist就是头指针,并且此时链表为空 

 在此时我们在主函数中创建一个新节点,data为1。如下图:

int main() {
	SListNode* plist = NULL;
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	newnode->data = 1;
	return NULL;
}

         这时我们需要想一想如何把新节点链接到链表中?

 显而易见,我们需要把新节点的next,即newnode下一个指针的地址置为空,并且使plist的值改为新节点的地址就ok了。

int main() {
	SListNode* plist = NULL;
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	newnode->data = 1;
    newnode->next=plist;
    plist=newnode;
	return NULL;
}

                                           plist由NULL变为newnode 

从上述代码中,我们可很明显的感觉到,plist的值发生了改变,它由NULL变为新节点的指针newnode;接下来我们要求一个函数来实现链表的头插,显然这个函数必须要传入头指针(因为只有知道链表的头指针,我们才能找到完整的链表,正像上一篇我们说到链表的头指针是无论如何也不能丢失的)和头插的数据。但是此时就需要我们好好想想-------如果把plist传过去,是否会达到预期的结果?认真想一想,假设我们把plist传过去,用p来接受,会不会达到预想的结果?

void SLFrontPush(SListNode* p, int x) {

}

我们在上一步的基础上,在SLFrontPush函数中把p置为NULL;看一看会不会对plist有什么影响?

void SLFrontPush(SListNode* p, int x) {
	p == NULL;
}
int main() {
	SListNode* plist = NULL;
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	newnode->data = 1;
	newnode->next = plist;
	plist = newnode;
	printf("%p\n", plist);
	SLFrontPush(plist, 0);
	printf("%p\n", plist);
    return NULL;
}

 对操作前和操作后的地址分别进行打印

 结果是前后打印出的plist值没有发生改变。即把plist传到函数中,对形参p进行操作是不会对主函数中的plist值发生改变的。为什么会这样呢?我们知道函数的形参实际上是对实参的一份临时拷贝,拷贝的内容是实参的内容,只不过是把相同的内容放到了不同的地址上。

 我们改变p时,把p置为NULL时,实际上是在SLFrontPush函数中在p开辟的空间上,对p的值进行改变,并不会影响到main函数中plist的值。我们也就无法使头指针指向新节点的地址。那我们该如何实现对plist的改变呢?

在开头时,我们实现了对头指针的成功改变。我们是怎么实现的呢?

对,我们是直接把plist拿过来进行操作的,也就是说如果我们能在函数中知道plist的地址,那么我们就可以通过它的地址,对它地址上存储的数据进行改变。而它地址上存储的数据正是头指针!

那么显而易见:我们需要传plist的地址即形参为SListNode**p,实参为&plist。​​​​​​​

                                                                      代码:

void SLFrontPush(SListNode** p, int x) {
	*p = NULL;
}
int main() {
	SListNode* plist = NULL;
	printf("%p\n", &plist);
	plist = (SListNode*)malloc(sizeof(SListNode));
	printf("%p\n", plist);
	SLFrontPush(&plist,0);
	printf("%p\n", plist);
    return NULL;
}

 结果:

 

 

 

      

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

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

相关文章

消息队列之 Kafka + EFLFK集群部署

目录 介绍 Zookeeper 概述 Zookeeper 定义 Zookeeper 工作机制 Zookeeper 特点 Zookeeper 数据结构 Zookeeper 应用场景 Zookeeper 选举机制 部署 Zookeeper 集群 操作过程&#xff08;3台服务器操作相同&#xff09; 消息队列概述 为什么需要消息队列&#xff08;M…

C#语言实例源码系列-实现电脑显示器的各种设置

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

ARM S5PV210 汇编实现时钟设置代码详解

一、时钟设置的步骤分析 第1步&#xff1a;CLK_SRC寄存器的设置分析 先选择不使用 PLL。让外部 24MHz 原始时钟直接过去&#xff0c;绕过 APLL 那条路。 CLK_SRC 寄存器其实是用来设置 MUX 开关的。在这里先将该寄存器设置为全 0&#xff0c;主要是 bit0 和bit4 设置为 0&am…

安全智能分析技术白皮书 数据共享

数据共享 定义内涵 数据共享 是指在多个用户或多个程序之间遵循一定规则共同享用数据&#xff0c;并进行各种操作、运算和分析的一种技术。数据共享包括数据发布、接口、交换等内容。 技术背景 随着数字经济成为拉动全球经济增长的新引擎&#xff0c;大数据成为经济中重要的…

聊聊零拷贝?

什么是零拷贝 零拷贝是指计算机在执行IO操作的时候&#xff0c;CPU不需要将数据从一个存储区复制到另一个存储区&#xff0c;进而减少上下文切换以及CPU拷贝的时间&#xff0c;这是一种IO操作优化技术 零拷贝不是没有拷贝数据&#xff0c;而是减少用户态&#xff0c;内核态的…

【Python】sklearn中的K-Means聚类

文章目录初步认识初值选取小批初步认识 k-means翻译过来就是K均值聚类算法&#xff0c;其目的是将样本分割为k个簇&#xff0c;而这个k则是KMeans中最重要的参数&#xff1a;n_clusters&#xff0c;默认为8。 下面做一个最简单的聚类 import numpy as np import matplotlib.…

Python基础语法之学习print()函数

在AI时代&#xff0c;编程已不是程序猿、攻城狮的专属属性&#xff0c;而是一个工具&#xff0c;或是一种技巧&#xff0c;本质上跟Word、PPT没啥区别。如果大家现在想掌握一门编程技能的话&#xff0c;那一定是 Python, 因为它既简洁高效&#xff0c;又能快速入门上手。本文将…

JavaWeb语法三:线程不安全问题的原因和解决方案

目录 1.线程的状态 2.线程不安全的原因 2.1&#xff1a;原子性 2.2&#xff1a; 可见性 2.3&#xff1a;有序性 3.解决线程不安全问题 3.1&#xff1a;synchronized 3.1.1&#xff1a;互斥 3.1.2&#xff1a;可重入 3.2&#xff1a;volatile关键字 3.3&#xff1a;w…

傻白入门芯片设计,盘点GPU业界的大佬(十五)

在PC个人电脑时代&#xff0c;英特尔&#xff08;Inter&#xff09;是无可争议的芯片巨头&#xff0c;凭借着X86架构在数据中心CPU中的压倒性地位&#xff0c;一度垄断全球90%的市场份额。然而在人工智能时代&#xff0c;以英伟达&#xff08;NVIDIA&#xff09;为首的GPU、AI芯…

大学生心里健康

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系信息文章信息、咨间师信息、服务信息、测试信息 管理员功能&#xff1a; 1、管理关…

[激光原理与应用-60]:激光器 - 光学 - 光的四大理论框架与其层次:几何光学、波动光学、电磁光学、电子光学

目录 第1章 光的四大理论框架与层次 第2章 光的四大理论各自的特点 2.1 几何光学&#xff08;粒子性&#xff09;》光学特征 2.2 波动光学&#xff08;波动性&#xff09; 2.3 电磁光学&#xff08;电学性&#xff09; 2.4 量子光学&#xff08;能量&#xff09; 第1章 光…

【信管4.2】定义范围与WBS

定义范围与WBS上次课程已经说过&#xff0c;今天的内容是非常重要的&#xff0c;可以说是整个范围管理的核心内容。因此&#xff0c;也请各位打醒十二分精神&#xff0c;一起来学习这两个非常重要的过程吧。定义范围定义范围&#xff0c; 是指定项目和产品详细描述的过程&#…

Canvas库 KonvaJS入门 2坐标体系总结

Canvas库 KonvaJS入门 2坐标体系总结一、 准备环境二、konvasJS坐标基本使用演示1. 按坐标放置控件2. 移动group3. 父元素 scale 变化4. 子元素scale变化5. 旋转一、 准备环境 KonvaJS的几个属性值与坐标都有关系&#xff0c;有时候不容易分清坐标如何计算&#xff0c;本文作个…

前端基础_传统Web页面

传统Web页面 传统Web页面就是打开浏览器&#xff0c;整个页面都会打开的应用。例如&#xff0c;笔者的个人网站http://siwei.me就是一个典型的“传统Web应用”&#xff0c;每次单击其中任意一个链接&#xff0c;都会引起页面的整个刷新 传统的页面每次打开&#xff0c;都要把…

π120E60 双通道数字隔离器 完美代替ISO7820FDW

π120E60 双通道数字隔离器 完美代替ISO7820FDW 。具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现5.0kV rms 隔离耐压等级和 DC 到 200Mbps信号传输。…

Seata实现分布式事务控制

目录 1. 启动Seata 1.1 下载seata 1.2 修改配置文件及初始化 2. 使用Seata实现事务控制 2.1 初始化数据表 2.2 添加配置 1. 启动Seata 1.1 下载seata 下载地址&#xff1a;https://github.com/seata/seata/releases/v1.3.0/ 1.2 修改配置文件及初始化 将下载得到的…

安全智能分析 思路方案

数据共享 定义内涵 数据共享 是指在多个用户或多个程序之间遵循一定规则共同享用数据&#xff0c;并进行各种操作、运算和分析的一种技术。数据共享包括数据发布、接口、交换等内容。 技术背景 随着数字经济成为拉动全球经济增长的新引擎&#xff0c;大数据成为经济中重要的…

[附源码]Node.js计算机毕业设计个人资金账户管理Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【OpenCV-Python】教程:6-3 Epipolar Geometry 对极几何

OpenCV Python Epipolar Geometry 对极几何 【目标】 学习多视图几何学习极点、对极线、对极约束等等&#xff1b; 【理论】 当我们使用针孔相机拍摄图像时&#xff0c;我们会丢失一个重要的信息&#xff0c;即图像的深度。或者图像中的每个点距离摄像机有多远&#xff0c;…

下一个AI舞台,名叫煤矿

如果大海给贝壳下的定义是珍珠&#xff0c;那么时间给煤的定义就是钻石。2020年初&#xff0c;我们曾经探访过山西一家大型矿山。矿山中的工程师对我们说&#xff0c;现在矿上特别需要新技术&#xff0c;需要数字化、智能化。但现在年轻人&#xff0c;尤其是懂AI、懂云计算的人…