研究链表空间销毁问题

news2025/1/29 14:05:45

💯💯💯

1.研究链表空间销毁问题

当链表使用完后,需要将链表销毁,那么该如何销毁呢?

void SLTDestroy(SLTNode* phead)//销毁单链表
{
	SLTNode* cur = phead;
   while(cur)
   {
	free(cur);
	cur = cur->next;
	}
}

你看这样对吗?
将cur指向的结点销毁,然后再去找下一个结点,依次循环直到没有结点为止。
但问题是cur都已经销毁了,下面怎么还能使用cur呢?
我们所说的销毁只是将空间的使用权归还给操作系统,使那块区域不再受原本指针控制,那块空间仍然存在,但里面的数据不一定存在。
所以我们在销毁cur以后,就不能再通过cur去找下一个结点了,那这样我们就无法再找到下一个结点了。
在这里插入图片描述
然后有人想那我们保存一下cur不就好了吗?

void SLTDestroy(SLTNode* phead)//销毁单链表
{
	SLTNode* cur = phead;
	//用一个指针exist来保存cur
		//然后释放cur再根据exist来找到下一个结点的
	SLTNode* exist = cur;
	while (cur)
{
	free(cur);
	cur = exist->next;
}
}

看似很合理但其实不合理
cur是用来保存phead,而exist是用来保存cur
想通过exist的来找到cur的下一个结点
这个问题和上面是一样的
也就是cur和exist先在都指向同一个结点,然后我们释放这个结点后,cur和
exist都没有用了呀,都不再指向原来的空间,我们保存的不是指向该结点的指针,而是应该保存这个结点啊,这样才能找到这个结点,不然一旦销毁,就找不回来了,还有我们是要找到cur下一个结点的地址哎,我们可以保存指向下一个结点的地址,这样就可以找到第二个结点了
我们应该是保存下一个结点的地址,不要保存自己的地址

void SLTDestroy(SLTNode* phead)//销毁单链表
{
	SLTNode* cur = phead;
//所以我们定义一个next指向cur的下一个结点的地址
	SLTNode* next = cur->next;
	while (cur)
	{
		free(cur);
		cur = next;
	}
}

这样就可以不断的释放结点了。
不过我们是不是忘记什么了?
释放后要将指针置NULL,那我们是不是就直接将cur置为NULL呢?

我们要注意到这里的参数是一级指针,要想真实改变它,需要的是二级指针才行,也就是在这里将cur置为NULL,而在函数外部,cur仍然不是NULL,因为cur是形参,形参的改变不影响实参,不过我们可以在函数外面将实参置NULL,每次调用销毁函数时,都不要忘记手动置空就可以了。
在这里插入图片描述

还有一种方法,我们可以通过指针来改变,有的人可能认为cur这不就是指针吗,我们要改变cur这个指针,需要改动的它的指针,也就是二级指针,
将二级指针传过来,然后我们对它解引用访问的就是指向cur的空间了,这时在函数内部将cur置NULL就可以啦。
在这里插入图片描述

2.总结: 要改变谁就要传它的指针过去

要改变int 类型的变量,就要传int*过去。
要改变指针,就要传它的指针。
理论就是形参的改变不影响实参

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

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

相关文章

Linux下Nginx安装使用

一、下载解压nginx # 进入要放安装包的目录 cd /opt/software # 下载安装包 wget https://nginx.org/download/nginx-1.20.2.tar.gz # 解压缩 tar -zxvf nginx-1.20.2.tar.gz -C /opt/modules # 进入解压后的目录 cd /opt/modules/nginx-1.20.2/二、安装nginx 1、安装编译器 …

剑指 Offer II 021. 删除链表的倒数第 n 个结点

题目链接 剑指 Offer II 021. 删除链表的倒数第 n 个结点 mid 题目描述 给定一个链表,删除链表的倒数第 n个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: …

MySQL的多表操作

多表关系 介绍 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、 订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习…

DolphinDB 机器学习在物联网行业的应用:实时数据异常率预警

数据异常率预警在工业安全生产中是一项重要工作,对于监控生产过程的稳定性,保障生产数据的有效性,维护生产设备的可靠性具有重要意义。随着大数据技术在生产领域的深入应用,基于机器学习的智能预警已经成为各大生产企业进行生产数…

logback无法删除太久远的日志文件?logback删除日志文件源码分析

logback无法删除太久远的日志文件?logback删除日志文件源码分析 最近发现logback配置滚动日志,但是本地日志文件甚至还有2年前的日志文件,服务器是却是正常的! 网上搜索了一波没有发现,只找到说不能删除太久远的旧日志…

Leetcode. 21 合并两个有序列表

尾插 核心思路:依次比较 ,取经过比较后较小值进行尾插 cur1 指向list1 ,cur 2指向list2 ,当cur1走完list1 或者cur2 走完list2 后停止 如果cur1走完list1 ,可以将cur2 整个拿下来尾插 如果cur2走完list2 ,可以将cur1 整个拿下来尾插 特殊情况 &#xff1…

c# 32位程序突破2G内存限制

起因 在开发过程中,由于某些COM组件只能在32位程序下运行,程序不得不在X86平台下生成。而X86的32位程序默认内存大小被限制在2G。由于程序中可能存在大数量处理,期间对象若没有及时释放或则回收,内存占用达到了1.2G左右&#xff…

瀑布开发与敏捷开发的区别,以及从瀑布转型敏捷项目管理的5大注意事项

事实证明,瀑布开发管理模式并不适合所有的软件项目,但敏捷项目管理却对大多数项目有效。那么当团队选择转型敏捷的时候有哪些因素必须注意?敏捷开发最早使用者大多是小型、独立的团队,他们通常致力于小型、独立的项目。正是他们的…

Keepalive+LVS群集部署

KeepaliveLVS群集部署一、Keepalive概述1、什么是Keepalive2、Keepalive工作原理3、Keepalive主要模块及作用4、Keepalived 服务重要功能(1)管理 LVS 负载均衡软件(2)支持故障自动切换(3)实现 LVS 负载调度…

SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理

SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理 目录SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理1. Spring的依赖注入1.1 依赖注入案例1.1.1 定义接口…

Python的运算符

Python支持多种运算符,下表大致按照优先级从高到低的顺序列出了所有的运算符,运算符的优先级指的是多个运算符同时出现时,先做什么运算然后再做什么运算。除了我们之前已经用过的赋值运算符和算术运算符,我们稍后会陆续讲到其他运…

解决launch:program .exe does not exist

二. 程序的运行和调试 1.launch.json 复制下列代码至launch.json,并根据指导做出相对/绝对路径修改 用 IntelliSense 了解相关属性。 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.micros…

虹科教您 | 在Linux环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件,可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送,用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…

Python进阶-----面向对象8.0(反射---对象属性方法操作)

目录 前言: 反射 1.getattr() 函数 2.setattr() 函数 3.hasattr() 函数 4.delattr() 函数 前言: 众所周知,每一个实例化对象都是有实例化属性或者方法的,之前我们对实例化对象进行属性方法查询、删除或者添加都是直接去通过…

day27_css

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、CSS 零、 复习昨日 见代码 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通…

MpAndroidChart3最强实践攻略

本篇主要总结下Android非常火爆的一个三方库MpAndroidChart的使用。可能在大多数情况下,我们很少会在Android端去开发图表。但如果说去做一些金融财经类、工厂类、大数据类等的app,那么绝对会用到MpAndroidChart。 一、前言 2018年,那年的我…

打包成JAR文件和WAR文件,到底有什么区别?

Spring Boot是一种基于Spring框架的快速开发应用程序的工具,可以轻松地构建可部署的独立应用程序。在使用Spring Boot时,你可能会注意到有两种不同的部署选项:打包成JAR文件和WAR文件。在这篇文章中,我们将深入探讨这两种部署选项…

Netty 简介

一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的,但…

Mysql常见的函数介绍

Mysql查询示例简介一、创建计算字段二、使用数据处理函数1. 文本处理函数2. 日期和时间处理函数3. 数值处理函数三、聚集函数总结简介 本篇博客中介绍了mysql查询时,常用的一些函数,融会贯通这些函数的使用,会对工作和学习有很大的帮助&#…

【软考中级信安】第四章--网络安全体系与网络安全模型

1.网络安全体系概述1.1 网络安全体系概念网络安全体系:是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。1.2 网络安全体系特性整体性:网络安全单元按照一定规则&#xff0…