初出茅庐的小李博客之链表知识1

news2024/11/26 13:35:19

链表知识1:

数组的特点:

空间连续,方便访问,只要知道首元素地址,就可以访问每个元素

数组的缺点:

需要提前分配固定大小的空间,一旦分配大小就不能改变 ,空间分配小了不够用,空间分配大了浪费空间

链表的概念:

​ 由一个一个的结点组成,可以通过第一个节点就能访问所有节点(节点存储的是数据信息)每个节点是动态分配的,但是动态分配的空间不连续,通过一些方式来将每个节点连接起来就构成了链表

链表的节点:

节点空间是不连续,每个节点都存储下一个节点的地址要求每个节点可以存地址,还存需要存的数据,所以节点的类型一定是结构体类型

节点结构体:

至少要包含两个部分,一部分用于存储下一个节点的数据,一个用于存储下一个节点的地址。

定义一个节点数据结构体:

typedef struct List Node_t;

struct List 
{
	/*数据区域有两个变量*/
	int a;
	float b;
	/*地址区域有一个指针*/
	Node_t *pNext;	 
};

这里容易犯一个错误,有挂结构体的嵌套可以参阅这篇博客。

结构体的嵌套问题 - 任智康 - 博客园 (cnblogs.com)

定义3个节点变量:

Node_t Head_Node; //表头变量 
Node_t Body_Node; //表身变量 
Node_t Tail_Node; //表尾变量

给每个节点变量赋值:

模拟链表操作把每个节点串联起来

	Head_Node.a = 1;
	Head_Node.b = 1.0;
	Head_Node.pNext = &Body_Node; //头节点下一节点地址  
	
	Body_Node.a = 2;
	Body_Node.b = 2.0;
	Body_Node.pNext = &Tail_Node;//身体节点下一节点地址  
	
	Tail_Node.a = 3;
	Tail_Node.b = 3.0;
	Tail_Node.pNext =NULL;//尾节点后面没有节点 地址赋值NULL 

通过给每个节点的数据赋值、然后把每个节点的地址指针赋值成下一节点的地址;最后一个节点的地址域赋值成空指针;

模拟链表操作访问每个节点:

	Node_t *pTemp =  &Head_Node;
	
	while(pTemp != NULL)
	{
		Node_Count++; 
		printf("节点 %d 的信息:\r\n",Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n",pTemp->a,pTemp->b,pTemp->pNext);
		pTemp =  pTemp->pNext;
	}

节点信息如下:

在这里插入图片描述

如何插入1个节点:

用malloc函数开辟一段空间 把这个节点信息进行填充 根据添加的位置把他的

    //插入一个节点插入到身体节点之后 尾巴节点之前 
	 	
	qTemp = (Node_t *)malloc(sizeof(Node_t)) ;
	
	qTemp->a = 4;
	qTemp->b = 4.0;
	
	//qTemp->pNext = &Tail_Node;
	qTemp->pNext = Body_Node.pNext;//插入的位置是尾巴节点之前 把尾巴节点的地址给当前节点
	
	
	Body_Node.pNext = qTemp; //把当前节点的地址给身体节点的下一节点 (插入到身体节点之后)

插入1个新的节点后的信息:


	printf("\r\n===============第2次链表信息===============\r\n");
    pTemp = &Head_Node;
	while(pTemp != NULL)
	{
		Node_Count++; 
		printf("节点 %d 的信息:\r\n",Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n",pTemp->a,pTemp->b,pTemp->pNext);
		pTemp =  pTemp->pNext;
	}
	Node_Count = 0;
	printf("\r\n===============第2次链表信息===============\r\n");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIceA5SJ-1688555989623)(C:\Users\23206\AppData\Roaming\Typora\typora-user-images\image-20230704205520015.png)]

如何把刚才插入的1个节点删除:

把身体节点的下一个节点地址改成尾部节点,并且把开辟的空间给释放掉

	Body_Node.pNext = &Tail_Node;
	free(qTemp);

删除掉这个节点后代码及运行效果

===============1次链表信息===============
节点 1 的信息:
 int 1
 float 1.000000
 Node_t* 00007FF62E50D920
节点 2 的信息:
 int 2
 float 2.000000
 Node_t* 00007FF62E50D8F0
节点 3 的信息:
 int 3
 float 3.000000
 Node_t* 0000000000000000

===============1次链表信息===============
第一次是三个节点
===============2次链表信息===============
节点 1 的信息:
 int 1
 float 1.000000
 Node_t* 00007FF62E50D920
节点 2 的信息:
 int 2
 float 2.000000
 Node_t* 000001DCA6B3F540
节点 3 的信息:
 int 4
 float 4.000000
 Node_t* 00007FF62E50D8F0
节点 4 的信息:
 int 3
 float 3.000000
 Node_t* 0000000000000000

===============2次链表信息===============
第二次是四个节点(添加了一个)
===============3次链表信息===============
节点 1 的信息:
 int 1
 float 1.000000
 Node_t* 00007FF62E50D920
节点 2 的信息:
 int 2
 float 2.000000
 Node_t* 00007FF62E50D8F0
节点 3 的信息:
 int 3
 float 3.000000
 Node_t* 0000000000000000

===============3次链表信息===============
第三次是三个节点(添加的节点又被删除了)

完整代码如下:

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

typedef struct List Node_t;

struct List
{
	/*数据区域有两个变量*/
	int a;
	float b;
	/*地址区域有一个指针*/
	Node_t* pNext;
};

Node_t Head_Node; //表头变量 
Node_t Body_Node; //表身变量 
Node_t Tail_Node; //表尾变量

Node_t* qTemp = NULL;

int Node_Count = 0;

int main(void)
{
	Head_Node.a = 1;
	Head_Node.b = 1.0;
	Head_Node.pNext = &Body_Node; //头节点下一节点地址  

	Body_Node.a = 2;
	Body_Node.b = 2.0;
	Body_Node.pNext = &Tail_Node;//身体节点下一节点地址  

	Tail_Node.a = 3;
	Tail_Node.b = 3.0;
	Tail_Node.pNext = NULL;//尾节点后面没有节点 地址赋值NULL 


	printf("\r\n===============第1次链表信息===============\r\n");
	Node_t* pTemp = &Head_Node;
	while (pTemp != NULL)
	{
		Node_Count++;
		printf("节点 %d 的信息:\r\n", Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n", pTemp->a, pTemp->b, pTemp->pNext);
		pTemp = pTemp->pNext;
	}
	Node_Count = 0;
	printf("\r\n===============第1次链表信息===============\r\n");



	//插入1个节点插入到身体节点之后 尾巴节点之前 	
	qTemp = (Node_t*)malloc(sizeof(Node_t));

	qTemp->a = 4;
	qTemp->b = 4.0;

	//qTemp->pNext = &Tail_Node;
	qTemp->pNext = Body_Node.pNext;


	Body_Node.pNext = qTemp;


	printf("\r\n===============第2次链表信息===============\r\n");
	pTemp = &Head_Node;
	while (pTemp != NULL)
	{
		Node_Count++;
		printf("节点 %d 的信息:\r\n", Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n", pTemp->a, pTemp->b, pTemp->pNext);
		pTemp = pTemp->pNext;
	}
	Node_Count = 0;
	printf("\r\n===============第2次链表信息===============\r\n");



	Body_Node.pNext = &Tail_Node;
	free(qTemp);



	printf("\r\n===============第3次链表信息===============\r\n");
	pTemp = &Head_Node;
	while (pTemp != NULL)
	{
		Node_Count++;
		printf("节点 %d 的信息:\r\n", Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n", pTemp->a, pTemp->b, pTemp->pNext);
		pTemp = pTemp->pNext;
	}
	Node_Count = 0;
	printf("\r\n===============第3次链表信息===============\r\n");
	return 0;
}

	while (pTemp != NULL)
	{
		Node_Count++;
		printf("节点 %d 的信息:\r\n", Node_Count);
		printf(" int %d\r\n float %f\r\n Node_t* %p\r\n", pTemp->a, pTemp->b, pTemp->pNext);
		pTemp = pTemp->pNext;
	}
	Node_Count = 0;
	printf("\r\n===============第3次链表信息===============\r\n");
	return 0;
}

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

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

相关文章

NeurIPS 2022 | HUMUS-Net:用于加速MRI重建的混合展开多尺度网络结构

文章目录 NeurIPS 2022 | HUMUS-Net&#xff1a;用于加速MRI重建的混合展开多尺度网络结构摘要方法 NeurIPS 2022 | HUMUS-Net&#xff1a;用于加速MRI重建的混合展开多尺度网络结构 Code: https://github.com/z-fabian/HUMUS-Net 摘要 在加速MRI重建中&#xff0c;患者的解剖…

vscode解决本地浏览器运行项目时的跨域问题-Live server

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 总结 最近在用face-api.js开发前端的实时人脸识别&#xff0c;加载已经训练好的tf模型&#xff0c;这一步需要加载模型json文件&#xff0c;但是本地测试的时候控制…

GAMES101笔记 Lecture 09 Shading3(Texture Mapping Cont.)

目录 Interpolation Across Triangles: Barycentric Coordinates(重心坐标)Interpolation Across Triangles(三角形内的插值)Why do we want to interpolate(我们为什么要在三角形内插值)What do we want to interpolate?(我们想插值得到什么&#xff1f;)How do we interpola…

vue echarts k线图 子功能设置

1 图中自定义选择区间, 手动鼠标拉取区间显示 2 底部数据选择条 dataZoom: [{type: inside,xAxisIndex: [0, 1],start: 98,end: 100},{show: true, // 这个是打开数据 选择条xAxisIndex: [0, 1],type: slider,top: 85%,start: 98,end: 100}], 3 鼠标在 k线图 选择区域 显示 的…

短视频抖音账号矩阵系统源码开发者自研(三)

一、站在开发者角度布局开发本套体系系统 开发技术新的方向。通过持续的技术创新和用户需求分析&#xff0c;我们将更加注重个性化开发本套短视频矩阵源码系统&#xff0c;目前市面上涵盖的基本功能有视频剪辑、绑定发布、智能回复、数据统计等一些基本的功能。此外我们在开发…

El-table 懒加载表格中新增、删除遇到的问题

前言 我是用的版本是&#xff1a; 官方给的例子中只是一个单纯的展示&#xff0c;但实际需求中可能会有一些其他需求&#xff0c;比如新增、修改。 然后遇到了各种问题&#xff0c;因此记录一下。 记录 :tree-props"{ children: children, hasChildren: hasChildren }…

NumPy怎样使用花式索引或布尔索引访问元素?

除了整数索引之外&#xff0c;NumPy中还提供了两个形式比较复杂的索引——花式索引和布尔索引&#xff0c;下面对这两种索引的基本用法进行详细的讲解。 1.花式索引 花式索引指以整数组成的数组或列表为索引。当使用花式索引访问一维数组时&#xff0c;程序会将花式索引对应的…

音视频基础 - YUV和RGB

1. 音视频名词概念 1.1 像素 像素是一张图片的基础单位&#xff0c;pixel&#xff0c;简称px 无数个像素组合在一起&#xff0c;就形成了一张图片。 1.2 分辨率 分辨率 垂直像素*水平像素&#xff0c;(理论上) 图像的分辨率越高&#xff0c;图像就越清晰。 比如下面左边这张…

【链表OJ】链表的回文结构

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1f4…

游游画U(秒用c++ string函数)

看到这道题&#xff0c;第一反应是简单的模拟&#xff0c;上手就写&#xff0c;后来看大佬代码&#xff0c;还是我太蠢了 我的&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long LL;int main() {int n;cin>>n;string s ""…

【Spark】RDD转换算子

目录 map mapPartitions mapPartitionsWithIndex flatMap glom groupBy shuffle filter sample distinct coalesce repartition sortBy ByKey intersection union subtract zip partitionBy reduceByKey groupByKey reduceByKey 和 groupByKey 的区别 a…

kafka的broker和replica和文件存储

zookeeper中存储的kafka信息 /brokers/ids&#xff0c;记录存在的服务器id/brokers/topics/test/partitions/0/state&#xff0c;记录leader和可用副本服务器/comsumers&#xff0c;0.9版本之前存储消费者的offset信息&#xff0c;但是会产生zookeeper和broker的跨节点通信/co…

SPSS读取数据文件(一)

1.读取Excel数据文件 &#xff08;1&#xff09;选择“文件”-“打开”-“数据”,在弹出的“打开数据”对话框下选择Excel文件&#xff0c;如图所示 &#xff08;2&#xff09;选择要打开的Excel文件&#xff0c;点击“打开”&#xff0c;如图所示 &#xff08;3&#xff09;可…

[论文总结]YOLO v1、YOLO v2、YOLO v3、YOLO v4、YOLOv5

背景 在这里我们主要介绍YOLO 系列的相关目标检测算法&#xff0c;从最开始的YOLO v1 一直到 YOLO v5。本文也借鉴了其他文档和原始论文。总结下来这五个方法的演进线路如下表格所示。 对比维度YOLO v1YOLO v2YOLO v3YOLO v4YOLO v5backboneVGGdarknet19darknet53darknet53da…

Lua学习笔记:浅谈对垃圾回收的理解

前言 本篇在讲什么 Lua的垃圾回收 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f…

Unity:sentinel key not found (h0007)

SSD换电脑&#xff0c;unity 编辑器无法打开&#xff1b; 具体步骤&#xff1a; 删除这个路径下的文件 C:\ProgramData\SafeNet 下 Sentinel LDK 打开Windows 的Cmd 命令行&#xff0c;输入编辑器版本下Unity.exe的路径&#xff0c; CD E:\Dev_Env\Unity\Hub\Editor\2020.3.3…

如何将 arduino-esp32 库作为 ESP-IDF 组件使用?

相关文档 arduino-esp32 SDKESP-IDF SDKESP-IDF 软件环境搭建说明Arduino 软件环境使用说明Arduino as an ESP-IDF component &#xff08;官方说明&#xff09; 环境准备 目前&#xff0c;最新 Master 版本的 arduino-esp32 SDK 要求使用 v4.4 版本的 ESP-IDF SDK 软件编译环…

05、Nginx反向代理

一、网关、代理与反向代理&#xff1a; 在Nginx中&#xff0c;网关、代理和反向代理是三种常见的功能&#xff0c;用于转发和处理请求。下面是它们的简要介绍&#xff1a; 网关&#xff08;Gateway&#xff09;&#xff1a; 网关在网络通信中起到中介的作用&#xff0c;将客户…

【视觉SLAM入门】1. 基础知识,运动观测,旋转(旋转矩阵,轴角,欧拉角,四元数)和eigen库基础

"山薮藏疾" 1. 运动与观测1.1 通用运动方程1.2 通用观测方程1.3 对SLAM的认识 2. 三维运动2.1 旋转与平移2.2 变换矩阵2.3 矩阵知识补充2.4 旋转向量2.5 欧拉角2.6 四元数2.7 其他变换 3. 编程基础3.1 链接库说明3.2 eigen库 注&#xff1a; 以后的方程中如未说明&am…

面试官:一千万的数据,要怎么查?

一个老生常谈的问题&#xff0c;SELECT *和SELECT具体字段那个快&#xff1f;在数据量少的时候可能没什么差别&#xff0c;但是数据量达到千万级&#xff0c;差距就显现出来。废话不多说&#xff0c;往下看 ↓。 SELECT * 和 SELECT 具体字段的区别 在 MySQL 中&#xff0c;SE…