P9 链表 清空链表|销毁链表

目录

前言 

01销毁链表 

02 清空链表

测试代码


前言 

                            

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

📝推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客》 ✨✨✨
🍉本篇简介  :  链表清空链表|销毁链表

✨ 只有我努力了 才有机会接触成功✨

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 链表节点的删除
  5. 链表插入新节点
  6. 链表的数据排序
  7. 链表的反序
  8. 清空链表的元素
  9. 求链表的长度等


在前面几章,我们学习了

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 求链表的长度等
  5. 还有链表结尾插入数据节点,非指定节点
  6. 链表指定节点后方插入数据
  7.  链表头的前方插入数据
  8. 删除链表节点

今天我们学清空链表和销毁链表

单链表的销毁与清空

  1. 销毁:连同头结点一起释放
  2. 清空:保留头结点;置头结点的指针域为NULL

01销毁链表 

销毁链表就是将链表在堆中构造的节点全部销毁,反正内存泄漏

我们首先 要定义一个函数destroyList,然后又一个参数,参数为一个结构体指针,用于传入链表的头节点,然后返回值也是一个结构体指针,不过链表销毁后,链表的头节点也就是个空指针了

销毁链表的函数大致就是长这样了

编译测试一下,我们先将链表清空在拿去打印试一下

没有问题,链表已经被清空了,链表的头指向了NULL 

02 清空链表

 

链表的清空就是保留头结点,然后让他节点的next = NULL就可以,代码上如上,但是有一点,链表是清空了,但是节点的内存是否完全释放,这个我确实不清楚了,不过我debug查看内存的时候,p最后的指向是指向NULL,最后释放

这里我不是特别懂,如果有大佬会的话可以个我将一下,谢谢

编译测试一下,没有问题,链表是被清剩下一个头节点了

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Link
{
	int data;
	struct Link *next;
};

/*打印链表数据*/
void PrintLink(struct Link *head)
{
	if(NULL == head)
	{
		puts("ERROR 空链表");
		return;
	}
	struct Link *prev = head;
	while (NULL != prev) 
	{
		printf("%d  ", prev->data);
		prev = prev->next;
	}
	printf("\n");
}

/*获取链表的节点数*/
int GetLinkNum(struct Link *head)
{
	struct Link *prev = head;
	int count = 0;
	while (prev != NULL)
	{
		count++;
		prev = prev->next;
	}
	return count;
}

struct Link *getHead(int data)
{
	struct Link* head = (struct Link*)malloc(sizeof(struct Link));
	head->data = data;
	head->next = NULL;
	return head;
}

/* 链表头插入数据,不指定位置*/
struct Link* frontInsertDataLink(struct Link *head, int data)
{
	struct Link *prev = head;
	struct Link *newLink = (struct Link *)malloc(sizeof(struct Link));
	newLink->data = data;
	newLink->next = prev;
	return newLink;
}

struct Link *frontInsertNodeDataLink(struct Link *head,int NodeIndex,int data)
{
	struct Link *prev = head;
	int cnt = 1;
	if(NodeIndex > GetLinkNum(prev)||(NodeIndex<0))
	{
		printf("ERROR: Link index out of range");
		return NULL;
	}
	else if (NodeIndex == 1)
	{
		prev = frontInsertDataLink(prev,data);
		return prev;
	}
	while (NULL != prev->next)
	{
		if(cnt == NodeIndex-1)
		{
			struct Link *newLink = (struct Link *)malloc(sizeof(struct Link));
			newLink->data = data;
			newLink->next = prev->next;
			prev->next = newLink;
			return head;
		}
		cnt++;
		prev = prev->next;
	}
	return NULL;
}


struct Link * deleteHeadLinkNode(struct Link *head,int NodeIndex)
{
	struct Link *prev = head;   //保存头节点的地址
	int cnt = 1;
	if(NodeIndex > GetLinkNum(prev)||(NodeIndex<0))   //判断是否越界
	{
		printf("ERROR: Link index out of range");
		return NULL;
	}


	if(1 == NodeIndex)   //如果要删除头节点
	{
		head = head->next;
		free(prev);
		return head;
	}

	struct Link *prior = NULL;   //遍历时用来保留前一个节点的状态
	while (NULL != prev)   //判断是不是最后一个节点
	{
		prior = prev;//用来保留前一个节点的状态
		prev = prev->next;   //走向下一个节点,也就是循环增量

		if(cnt == NodeIndex-1)  //找到需要删除的节点
		{
			if(NULL == prev->next)    //1.如果找到的是尾节点
			{
				prior->next = NULL;       //原来尾节点的前一个为节点变成了新尾节点
				free(prev);        //释放原来尾节点的内存
				return head;
			}
			else    //如果找到的是普通节点
			{
				prior->next = prev->next;   //要删除的节点的前一个节点和后一个节点相连
				free(prev);
				return head;
			}
		}
		cnt++;
	}
	return NULL;   //没找到对应节点,操作失败,返回NULL
}

//销毁链表
struct Link* destroyList(struct Link *head) 
{
	struct  Link *p = head;
	while (p != NULL)
	{
		head = head->next;
		free(p);
		p = head;
	}
	return head;
}

//清空链表
void clearList(struct Link *head) 
{
	struct Link *p;
	while (head->next) {
		p = head->next;
		head->next = p->next;
		free(p);
	}
	p = NULL;
	free(p);
}

int main()
{
	struct Link *head = getHead(3);
	head = frontInsertDataLink(head, 5); 
	head = frontInsertDataLink(head, 2); 
	PrintLink(head);
	head = frontInsertNodeDataLink(head, 1,4);
	PrintLink(head);
	head = deleteHeadLinkNode(head,2);
	PrintLink(head);
	head = destroyList(head);
	//head = destroyList(head);
	PrintLink(head);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言二叉树的基本概念(一)

目录 二叉树 二叉树的分类&#xff08;目前只谈两种&#xff09; 满二叉树 完全二叉树 二叉树的性质&#xff08;其余的可以自己总结&#xff09; 选择练习 二叉树的存储结构 顺序存储方式 链式存储方式 二叉树 定义&#xff1a;二叉树是一种特殊的树状数据结构&…

pytorch 常用api笔记

view_as()函数 函数定义&#xff1a;view_as(tensor) [参数为一个Tensor张量] 该函数的作用是将调用函数的变量&#xff0c;转变为同参数tensor同样的形状。 例子 data1 [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [10, 11]]] t1 torch.Tensor(data1).long() # size2…

RTSP流媒体播放器

rtsp主要还是运用ffmpeg来搭建node后端转发到前端&#xff0c;前端再播放这样的思路。 这里讲的到是用两种方式&#xff0c;一种是ffmpeg设置成全局来实现&#xff0c;一种是ffmpeg放在本地目录用相对路径来引用的方式。 ffmpeg下载地址&#xff1a;http://www.ffmpeg.org/do…

Linux常用命令——atq命令

在线Linux命令查询工具 atq 列出当前用户的at任务列表 补充说明 atq命令显示系统中待执行的任务列表&#xff0c;也就是列出当前用户的at任务列表。 语法 atq(选项)选项 -V&#xff1a;显示版本号&#xff1b; -q&#xff1a;查询指定队列的任务。实例 at now 10 minu…

多路径传输(MPTCP MPQUIC)数据包调度研究总结

近些年来&#xff0c;以5G和Wifi6为代表的无线通信技术发展迅速&#xff0c;并已经在全世界实现了大规模部署。此外&#xff0c;智能手机等移动设备不断迭代更新&#xff0c;其网络通信能力也持续演进&#xff0c;使得应用同时利用多个不同网卡在多条不同物理链路上&#xff08…

【AIGCode】让AI生成随机数据

用户测试数据库性能&#xff0c;SQL性能等。 交互流程&#xff1a; 假如我的表结构是&#xff1a; CREATE TABLE prd_article_inf ( ARTICLE_INF_ID int(11) NOT NULL AUTO_INCREMENT, ARTICLE_AUTHOR varchar(24) DEFAULT NULL, ARTICLE_BRIEF varchar(255) DEFAULT NULL, …

面试题之分布式事务篇

1.什么是分布式事务&#xff1f; 概述&#xff1a;在分布式系统上一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务节点上&#xff0c;且属于不同的应用&#xff0c;分布式事务需要保证这些小操作要 么全部成功&#xff0c;要么全部失败。 如下所示&…

课题学习(十四)----三轴加速度计+三轴陀螺仪传感器-ICM20602

本篇博客对ICM20602芯片进行学习&#xff0c;目的是后续设计一个电路板&#xff0c;采集ICM20602的数据&#xff0c;通过这些数据对各种姿态解算的方法进行仿真学习。 一、 ICM20602介绍 1.1 初识芯片 3轴陀螺仪&#xff1a;可编程全刻度范围(FSR)为250 dps&#xff0c;500 d…

Apache shiro1.2.4反序列化漏洞(CVE-2016-4437)

1.搭建环境 2.准备好ysoserial反序列化工具和poc.py 3.输入账号和密码然后记得勾上remember me&#xff0c;然后抓包。 4.后来了解到&#xff0c;shiro是基于CommonsBeanutils的反序列化链 5.所以通过ysoserial&#xff0c;生成那个的gadget&#xff08;小工具)&#xff…

探索元宇宙链游戏:一场数字世界的奇妙融合

随着互联网的飞速发展&#xff0c;以及人们不断对互动娱乐体验的要求提高&#xff0c;元宇宙渐渐成为人们追求的目标。 而区块链技术的出现给元宇宙链游开发带来了新的机遇和挑战。 一、元宇宙链游定义 元宇宙链游全称为基于区块链技术的元宇宙游戏&#xff0c;是一种新型的网…

SSM整合(注解版)

SSM 整合是指将学习的 Spring&#xff0c;SpringMVC&#xff0c;MyBatis 进行整合&#xff0c;来进行项目的开发。 1 项目基本的配置类 1.1 Spring 配置类 这个配置类主要是管理 Service 中的 bean&#xff0c;controller 层的 bean 对象是 SpringMVC 管理的 package cn.ed…

在高德地图SDK上加载五层十五级瓦片的方法

目录 前言实现思路加载高德SDK,显示地图加载GroundOverlay类加载五层十五级瓦片清除瓦片总结前言 因为项目需求,需要在高德地图上加载五层十五级瓦片。这八竿子打不着的结合,着实没有思路。好在高德地图SDK提供了一个加载地表覆盖物的接口(GroundOverlay),这就为加载五层…

大数据集群增加数据盘,平衡数据盘HDFS Disk Balancer

大数据集群增加数据盘&#xff0c;平衡数据盘HDFS Disk Balancer 官网&#xff1a;https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.jsonhdfs diskbalancer -q…

无需公网IP!Apache服务器本地部署与内网穿透实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

01、pytest:帮助你编写更好的程序

简介 ​pytest框架可以很容易地编写小型、可读的测试&#xff0c;并且可以扩展以支持应用程序和库的复杂功能测试。使用pytest至少需要安装Python3.7或PyPy3。PyPI包名称为pytest 一个快速的例子 content of test_sample.py def inc(x):return x1def test_ansewer():assert i…

Presto:基于内存的OLAP查询引擎

Presto查询引擎 1、Presto概述1.1、Presto背景1.2、什么是Presto1.3、Presto的特性2、Presto架构2.1、Presto的两类服务器2.2、Presto基本概念2.3、Presto数据模型3、Presto查询过程3.1、Presto执行原理3.2、Presto与Hive3.3、Presto与Impala3.4、PrestoDB与PrestoSQL4、Presto…

YehdBPev通过AES解密为123456

1、代码 import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.symmetric.AES; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;public class Test {public static void main(String [] args) {Secr…

使用群晖Docker搭建HomeAssistant并实现异地公网访问家中智能设备

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使…

iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用

​ 在网上搜“代码混淆”关键词&#xff0c;可以看到n多教程。包括本篇博客&#xff0c;大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有&#xff0c;但是对于我个人来说&#xff0c;很难找到一篇博客概括完全的&#xff0c;所以还是总结一…

IDEA使用git从远程仓库获取项目

将地址填入url中 然后直接clone就行