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

精讲双向链表的销毁

相信大家各位学习双向链表的时候对链表的销毁,都或多或少有些小疑惑,我到底是传一级指针还是传二级指针

木关系,这些都是小意思,今天我将为大家share 一下关于到底如何进行正确传指针

对于链表是销毁其实就是对链表进行一个结点一个结点的删除

注意,最后不要忘了还需要对哨兵位(phead)进行free

方法一:传一级指针

void Destroy(ListNode* phead)//链表销毁;想一下,传一级指针还是二级?  在这里我们传入一级指针,为了保持接口一致性
{
	//销毁我们是一个一个进行删除,自然就需要遍历
	assert(phead);
	ListNode* del = phead->next;
	while (del != phead)
	{
		ListNode* next = del->next;
		free(del);
		/*del = NULL;*/    //  ?
		del = next;
	}
	//来到这说明,此时只有一个哨兵位
	free(phead);
	phead = NULL;

}

调试结果如下:

显而易见,当我们把哨兵位这个结点进行free的之后,他确实是为空了但是此时我们的plist这个结点并没有置空,这是为什么呢???

 函数的形参是对实参的一份临时拷贝,对形参的临时修改并不会影响实参的变化

因此有时我们就需要传地址来进行

 我们不妨试一下,我们手动把plist这给结点进行free

结果如下:

 报错显示:无效的堆上的指针。换言之就是我们已经把plist这个结点进行free了,无需在进行一次free了,所以在传一级指针时,我们只需手动把plist 这个结点进行置为空即可

 方法2:传二级指针

代码如下;

void LTDestroy(ListNode** pphead) 
{
		assert(pphead && *pphead);//确保我们头节点地址以及哨兵位职工地址有效
		ListNode* cur = (*pphead)->next;
		while ( cur!=*pphead )
		{
			ListNode* next = cur->next;
			free(cur);
			cur = next;
		}
		free(*pphead);//对哨兵位进行释放
		*pphead = NULL;
	}

 调试结果如下:

显然此时plist这个指针是置空了

  但是当我们把自己所写的代码交给用户使用的时候,或许存在一些小问题

我们用户是很懵的,因为他不知道自己要什么时候传二级指针,什么时候传一级指针;其次为了保持接口一致性,我们还是传一级指针就Ok~~~


http://www.kler.cn/a/108306.html

相关文章:

  • SpringBoot的MVC接口增加签名
  • 线性直流电流
  • pikachu靶场搭建详细步骤
  • 欲海航舟:探寻天性驱动下的欲望演变与人生驾驭
  • 「瑞仕云曜璟庭」多轨交通+成熟配套 杨浦滨江宜居之高地
  • 代码随想录Day51 99. 岛屿数量,99. 岛屿数量,100. 岛屿的最大面积。
  • 【算法|动态规划 | 01背包问题No.1】AcWing 426. 开心的金明
  • springboot 项目非docker 部署自动启动
  • 【教3妹学编程-java实战5】结构体字段赋值的几种方式
  • 推理还是背诵?通过反事实任务探索语言模型的能力和局限性
  • [双指针](一) Leetcode 283.移动零和1089.复写零
  • 2.MySQL的调控按钮——启动选项和系统变量
  • 什么是离岸金融 (OFFSHORE FINANCE)
  • 关于FTP的一些往事
  • Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第四章 C++多线程系统编程精要
  • 数据库简史:多主数据库架构的由来和华为参天引擎的机遇
  • [算法]求n!在m进制下末尾有多少个0
  • Redis(09)| Reactor模式
  • Vue 数据绑定 和 数据渲染
  • 分布式消息队列:RabbitMQ(1)
  • [ROS系列]ubuntu 20.04 从零配置orbslam3(无坑版)
  • 广州华锐互动:VR虚拟现实物理学习平台,开启数字化教学新格局
  • acwing 5283. 牛棚入住
  • 应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
  • 怎么降低Linux内核驱动开发的风险?
  • 粤嵌实训医疗项目--day03(Vue + SpringBoot)