静态链表和动态链表

数据结构之静态链表 静态链表:分配一整片连续的内存空间,各个结点集中安置,逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。也就是说静态链表是用数组来实现链式存储结构,静态链表实际上就是一个结构体数组举例:通过a[1]中存放的游标变量3可找到存放的数据元素5的后继元素为3,再通过a[3]中存放的游标变量2可找到存放数据元素3的后继数据为2,以此类推,直到某元素的游标变量为0即可停止(注:a[0]为头结点不存储数据元素) 阅读详情

1. 静态链表和动态链表的区别:

(1)静态链表放在栈区

(2)动态链表放在堆区,堆区数据必须要手工开辟,手工释放

2. 单链表定义

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

struct LinkNode
{
	int num;  //数据域
	struct LinkNode * next;  //指针域
}

3. 静态链表的创建方法及使用

struct LinkNode node1 = {10, NULL};
struct LinkNode node2 = {20, NULL};
node1.next = &node2;  //建立结点之间的关系
struct LinkNode * pCurrent = &node1;
while(pCurrent != NULL)   //遍历链表
{
	printf("%d\n", pCurrent->num);  //打印结点中的数据
	pCurrent = pCurrent->next;
}

4. 动态链表的创建方法及使用

struct LinkNode * node1 = malloc(sizeof(struct LinkNode));
struct LinkNode * node2 = malloc(sizeof(struct LinkNode));
node1->next =node2;  //建立结点之间的关系
struct LinkNode * pCurrent = node1;
while(pCurrent != NULL)   //遍历链表
{
	printf("%d\n", pCurrent->num);  //打印结点中的数据
	pCurrent = pCurrent->next;
}
free(node1);
free(node2);

5. 常用约定:头结点不保存数据域,只保存指针域的一个空结点。

设定空头结点的好处:空头结点便于头插,头部插入数据方便,头结点永远不会变!


6. 动态链表的相关操作(函数)

(1)初始化链表,让用户拿到一个链表的头结点

struct LinkNode * initLinkList()
{
	//创建头结点
	struct LinkNode * pHeader = malloc(sizeof(struct LinkNode));
	if(pHeader != NULL)
	{
		return NULL;
	}
	pHeader->next = NULL;  //初始化头结点
	
	// 让用户初始化链表
	//专门用于维护当前链表中的尾节点,好处在于添加数据方便
	struct LinkNode * pTail = pHeader; //这句很重要!!!!
	int val = -1;
	while(1)
	{
		printf("请输入链表中的数据,-1代表输入结果\n");
		scanf("%d",&val);
		if(val == -1)
		{
			break;
		}
		//创建新结点	
		struct LinkNode * newNode = malloc(sizeof(struct LinkNode));
		newNode->num = val;
		newNode->next = NULL;
		
		//更改指针的指向
		pTail->next = newNode;  //相当于当前链表的最后一个结点的指针指向了当前新创建的结点
		pTail = newNode;//使pTail指向当先新建的结点。即永远指向最后一个结点
	}
	return pHeader;
}

(2)动态链表的遍历

void foreachList(struct LinkNode * pHeader)
{
	if(pHeader == NULL)
	{
		return;
	}
	struct LinkNode * pCurrent = pCurrent->next; 
	while(pCurrent != NULL)   //遍历链表
	{
		printf("%d\n", pCurrent->num);  //打印结点中的数据
		pCurrent = pCurrent->next;
	}
}

(3)动态链表插入结点

void insertList(struct LinkNode * pHeader, int oldVal, int newVal)
{
	//在oldVal后面插入newVal
	if(pHeader == NULL)
	{
		return;
	}
	//创建两个临时辅助指针
	struct LinkNode * pPrev = pHeader;
	struct LinkNode * pCurrent = pHeader->next;
	while(pCurrent != NULL) 
	{
		//用户传入的数据和遍历的链表中的数据一样
		if(pCurrent->num == oldVal)  //找到了
		{
			break;
		}
		//没找到,两个指针往后移
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
	//创建新结点
	struct LinkNode * newNode = malloc(sizeof(struct LinkNode));
	newNode->num = newVal;
	newNode->next = NULL;
	
	//更改指针的指向
	newNode->next = pCurrent;  
	pPrev->next = newNode;
}

(4)删除动态链表中一个结点

void deleteList(struct LinkNode * pHeader, int Val)
{
	if(pHeader == NULL)
	{
		return;
	}
	//创建两个临时辅助指针
	struct LinkNode * pPrev = pHeader;
	struct LinkNode * pCurrent = pHeader->next;
	while(pCurrent != NULL) 
	{
		//用户传入的数据和遍历的链表中的数据一样
		if(pCurrent->num == Val)  //找到了
		{
			break;
		}
		//没找到,两个辅助指针往后移
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
	//如果链表中没有用户传入的Val值,直接return
	if(pCurrent == NULL)
	{
		return;
	}
	
	//链表中有用户传入的Val值且已经找到,更改指针的指向
	pPrev->next = pCurrent->next;
	
	//删除结点并释放堆区数据
	free(pCurrent);  
	pCurrent = NULL;  //严谨的写法,防止野指针出现
}

(5)清空一个动态链表

注意:清空一个动态链表 是 把所有有数据的结点释放掉,还留着一个头结点,并没有将链表销毁掉,还可以从头插入数据。

void clearList(struct LinkNode * pHeader)
{
	if(pHeader == NULL)
	{
		return;
	}
	//创建1个临时辅助指针
	struct LinkNode * pCurrent = pHeader->next; //指向第一个有效数据的结点
	while(pCurrent != NULL) 
	{
		//先保存住下一个结点的位置
		struct LinkNode * nextNode = pCurrent->next;
		
		//删除当前结点并释放堆区数据
		free(pCurrent);  
		pCurrent = nextNode;
	}
	pHeader->next = NULL;
}

(6)销毁链表

注意:销毁链表 是 将链表销毁掉,头结点也没了。

void destroyList(struct LinkNode * pHeader)
{
if(pHeader == NULL)
	{
		return;
	}
	
	//先清空链表
	clearList(pHeader);
	
	//将头结点也释放掉
	free(pHeader);  
	pHeader = NULL;
}

(7)翻转链表

void reverList(struct LinkNode * pHeader)
{
	if(pHeader == NULL)
	{
		return;
	}
	//创建三个临时辅助指针
	struct LinkNode * pPrev = NULL;
	struct LinkNode * pCurrent = pHeader->next;
	struct LinkNode * pNext = NULL;
	
	while(pCurrent != NULL) 
	{
		
		pNext = pCurrent->next;  //pNext存储当前结点的下一个结点
		pCurrent->next = pPrev;  
		
		//移动辅助指针
		pPrev =pCurrent;  //pPrev永远指向翻转后链表的第一个结点
		pCurrent = pNext; //pCurrent永远指向剩下没有翻转的链表的第一个结点
	}
	pHeader->next = pPrev;
}

 

数据结构与算法(三)——线性表(下)静态链表篇 Q1:啥叫静态链表?简单点说静态链表是用数组描述的链表。注意:和前面的线性存储不一样,这里是用数组模拟链表。Q2:为啥会出现静态链表这种东西?A:这就得说说C语言的伟大了,因为它具有指针的能力,这样使得它可以非常容易的操作内存中的地址和数据。但后来的面向对象语言,如:Java、C#等。它们是没有指针这个东西的。更别说一些早期的语言,如:Basic、Fortran等。由于没有指针,按照之前单链表的结构,指针域就没办法实现。所以衍生了静态链表这个产物。Q3:那我们是如何用数组描述链表的呢? 阅读详情

相关推荐

静态链表的定义与基本操作(C语言版)(数据结构与算法)

由于静态链表没有指针来直接跳转到下一个节点,所以需要使用游标来遍历链表。在静态链表中如果要表示,这个结点是最后一个结点,游标的值可以设为 -1, 表示之后已经没有其他结点了。遍历静态链表,找到要插入位置的前一个节点。可以使用一个游标来遍历链表,初始时指向链表的头节点。将新节点的下一个节点指向前一个节点的下一个节点,然后将前一个节点的下一个节点指向新节点的位置。这是一个简单的线性查找算法,时间复杂度为O(n),其中n是链表中节点的数量。在静态链表的空闲位置上分配一个新节点,为新节点赋值。

AII_IIA的博客 3844

静态链表和动态链表的区别

静态链表和动态链表的区别: 静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。 1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。 2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表

我的博客 5万+

ADS仿真功率放大器实例学习笔记

ADS仿真功率放大器实例学习笔记

qq_36521926的博客 1万+

一文详解动态链表和静态链表的区别

一文详解动态链表和静态链表的区别

大道至简,求同存异 6004

HSmartWindowControl vs HWindowControl:Halcon老鸟教你如何根据项目需求选对控件(附性能对比)

本文深度对比Halcon图像处理中的HSmartWindowControl与HWindowControl控件,从性能、内存占用和交互体验等维度提供选型建议。HSmartWindowControl在硬件加速渲染、智能内存管理方面表现优异,特别适合医疗影像和工业检测等高性能需求场景,而HWindowControl则更适合兼容旧系统和资源受限环境。

weixin_30765505的博客 471

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

C语言——静态链表和动态链表

超详细的静态链表和动态链表

qq_59990833的博客 1223

基于MicroBlaze与LWIP的FPGA以太网通信实战指南

本文详细介绍了基于MicroBlaze软核处理器与LWIP协议栈的FPGA以太网通信实现方案。通过Vivado工具链配置硬件设计,结合LWIP轻量级TCP/IP协议栈优化,提供高效、低成本的嵌入式网络解决方案,适用于工业控制等场景。文章包含硬件设计、软件配置及常见问题排查等实战指南。

weixin_29290863的博客 534

静态链表和动态链表 区别

使用C语言描述静态链表和动态链表 静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表。 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考http://www.cnblogs.com/choon/p/3876606.html 静态链表 .

微电子学与固体电子学-俞驰 737

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

科研绘图系列:R语言绘制极坐标饼图(pie plot)

科研绘图系列:R语言极坐标饼图(pie plot)

专注生信领域 1053

静态链表和动态链表的实现

静态链表 使用静态链表存储数据,需要预先申请足够大的一整块内存空间,也就是说,静态链表存储数据元素的个数从其创建的那一刻就已经确定,后期无法更改。 比如,如果创建静态链表时只申请存储 10 个数据元素的空间,那么在使用静态链表时,数据的存储个数就不能超过 10 个,否则程序就会发生错误。 不仅如此,静态链表是在固定大小的存储空间内随机存储各个数据元素,这就造成了静态链表中需要使用另一条链表(...

Do Better 1135

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

Robot_PLC_HMI_Automation 1万+

静态链表和动态链表的区别:

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。 1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。 2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点...

weixin_30335353的博客 280

Xilinx FPGA平台DDR3设计保姆式教程(1)DDR3基础简介

xilinx平台DDR3设计(1)DDR3简介 如果我们只是拿来用ddr搬砖,那么它就简单,知道IP怎么使用就好,但是要想知其所以然,理论知识是必备的,这也是我们初学者所欠缺的东西,慢慢修炼吧! 目录 一、DDR3简介 二、地址的概念及容量计算 三、重要给概念理解 3.2 列地址脉冲选通潜伏期 3.4 掩码 四、参考资料 一、DDR3简介 DDR3全称double-data-rate 3 synchronous dynamic RAM,即第三代双倍速率同步动态随机存储器。...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态链表和静态链表

链表是一种动态分配内存的一种结构,可根据需要开辟所需的内存单元。 链表中有一个“头指针”的变量,它存放一个地址,该地址指向一个元素。链表中每个元素称为“结点”,每个结点包括两个部分,一是我们所需的实际数据,二是下一个结点的地址。最后一个元素不指向其他元素,被称为表尾。在其中放入一个“NULL”(空地址,表示链表结束。 要找到某一元素必须要找到上一个元素,根据上一元素提供的地址找下个元素。...

Muzijin0129的博客 584

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态链表和静态链表的区别

静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。 *所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。*/ struct Student

Aikenlan的博客 6592

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2.9静态链表和动态链表区别详解

前面学习了链表,其存储结构如图 1 所示: 图 1 链表存储结构 类似图 1 这样的链表,它更喜欢人们称它为 "动态链表"。 随后又接触了静态链表。同样是存储图 1 中的数据 {1,2,3},使用静态链表存储数据的状态如图 2 所示: 图 2 静态链表存储数据示意图 为了让读者分清动态链表和静态链表,本节来分析一下它们之间的区别和联系。 静态链表和动态链表的共同点是,数据之间"一...

weixin_42437172的博客 1107

C语言动态链表经典程序,C语言静态链表和动态链表

1. 静态链表结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为“引用自身的结构体”。如:struct link{char ch;struct link *p;} a;p是一个可以指向 struct link 类型变量的指针成员。因此,a.p = &a 是合法的表达式,由此构成的存储结构如图1所示。图1 引用自身的结构体例1 一...

weixin_39972996的博客 276

c语言——静态链表和动态链表

c语言——静态链表 链表结点类型定义 如何遍历链表 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> //链表结点类型定义 struct LinkNode { int data; struct LinkNode *next; }; void test() { struct LinkNode node1 = { 10, NULL };

mirana的专栏 407

静态链表 和 动态链表

动态链表   静态     静态链表

zbmax001的专栏 639
上一篇: 结合回调函数对任意类型数组排序
下一篇: 结构体内存对齐之对齐规则
JCjunior
博客等级 码龄11年 45粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值