线性表之静态链表

news2024/11/13 12:14:06

1. 静态链表的设计

1.1 定义静态链表

        链表是由多个相同类型的节点组成的线性表,它的每个节点都包含一个数据项和一个指向下一个节点的指针,链表中各个节点的地址是不连续的。

下面是一个用于存储整形数据的链表节点结构:

struct Node
{
    int data;
    struct Node* next;
};
  • data:用于存储实际数据
  • next:用于连接当前节点的后继节点,存储的是下一个节点的地址(很多资料中将其称之为游标)

        静态链表是一种使用数组实现的链表,通常用于环境中无法使用指针的情况。这种结构在内存中是连续存储的,但节点的位置可以变化,因此称为静态链表。

        静态链表的节点结构和链表类似,但是不完全相同,当前节点连接后继节点使用的是索引而不是指针。

下面是一个用于存储整形数据的链表节点结构:

struct Node
{
    int data;
    int next; 
};
  • data:用于存储实际数据
  • next:使用索引的方式记录后继节点的位置

        由于静态链表是一个数组,也就是说在存储数据之前元素对应的存储空间就已经存在了,此时我们就需要考虑以下几个问题:

  • 如何判断当前节点是一个空闲节点?
  • 如何判断当前节点是一个有效的数据节点?
  • 如何判断当前节点是链表的尾节点?

        由于链表的数据域data的值是千变万化的,所以我们只能在它的next域上下功夫,在使用静态链表之前可以对它的值做如下规定(不考虑头结点):

  • next == -1:当前节点为静态链表的尾节点
  • next == -2:当前节点为静态链表的空闲节点
  • next >= 0:当前节点为静态链表的有效的数据节点

1.2 链表头结点

        不论是链表(动态)还是静态链表根据处理方式的不同,都可以分为两大类:带头结点的链表和不带头结点的链表。

        带头结点:链表的第一个节点(头结点)的data域不存储数据,next域记录的是第一个数据节点的位置(索引或者地址)
        不带头结点:链表的第一个节点的data域存储数据,next域记录的是第二个数据节点的位置(索引或者地址)
        一般情况下建议大家使用带头结点的链表,带头结点的链表避免了链表中没有节点的这种情况(空链表指的是链表中没有数据节点),减少了bug的产生,并且更容易处理和维护。

下图描述的是一个静态链表,请大家动脑分析,完成对这个链表的遍历。

        虽然数组中存储的数据的按照下边遍历顺序为:null、a、b、c、f、d、g,但实际上在静态链表中存储的数据顺序并非如此。其中的关键点就是:先看各个节点中的 next 域记录的位置,然后再把这个位置作为数组的下标,去访问对应的数组元素。

  • 数组0号元素为静态链表的头结点,next=6,所以第1个数据为g
  • 数组6号元素为静态链表的数据节点,next=1,所以第2个数据节点为a
  • 数组1号元素为静态链表的数据节点,next=5,所以第3个数据节点为d
  • 数组5号元素为静态链表的数据节点,next=4,所以第4个数据节点为f
  • 数组4号元素为静态链表的数据节点,next=2,所以第5个数据节点为b
  • 数组2号元素为静态链表的数据节点,next=3,所以第6个数据节点为c
  • 数组3号元素为静态链表的尾节点,没有后继节点

因此遍历静态链表,得到的序列应该是:g、a、d、f、b、c

2. 静态链表和数组

        静态链表和数组的本质是相同的,但是在使用方式上又有所不同,下面就给大家总结一下二者的优缺点:

插入删除操作,静态链表效率高

  • 静态链表只需要修改对应节点的next域的值,需不要移动元素
  • 数组在插入新节点需要大量元素后移,删除节点需要大量元素前移

访问指定位置的元素,数组效率高

  • 静态链表需要遍历才能找到这个节点
  • 数组通过下标就可以找到该节点了

默认情况下内存大小是固定的

  • 申请的内存空间大,但是数据量少,浪费存储空间
  • 申请的内存空间小,但是数据量大,内存不够用

        静态链表和数组是对同一块连续内存的两种不同使用方式,二者没有孰优孰劣之分,作为一名合格的程序猿要做的就是具体问题具体分析,从众多解决方案中找出一个最优解。

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

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

相关文章

深度学习与大模型第1课环境搭建

深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先,您需要安装 Anaconda,这是一个开源的 Python 发行版,能够简化包管理和环境管理。以下是下载链接及提取码: 链接:https://pan.baidu.com/s/1Na2xOFpBXQMgzXA…

Text Control 控件教程:智能文档处理 (IDP)

TX Text Control 是一款功能类似于 MS Word 的文字处理控件,包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理,网站内容发布,电子病历中病案模板创建、病历书写、修改历史、连续打…

【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式

文章目录 什么是云计算服务本地部署VS云计算SaaS PaaS IaaS公有云、私有云、混合云为什么优先发展云计算服务的厂商是亚马逊、阿里巴巴等公司 什么是云计算服务 根据不同的目标用户,云计算服务(Cloud Computing Services)分为两种&#xff1…

前端性能优化:提升网站加载速度的五个关键技巧

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端性能优化:提升网站加载速度的五个关键技巧1. 引言2. 前端性能优化的五个关键技巧2.1 减少HTTP请求技巧说明实现示例 2.2 启用浏览器缓存技巧说明实现示例 2.3 使用内容分发网络(CDN)技巧说明…

完美洗牌的秘密(五)——完美洗牌的性质和变体

‍ ‍早点关注我,精彩不错过! 之前4篇文章,我们介绍清楚了完美洗牌的3对基本定理。今天,我们来看在这一般的描述基础上,还有哪些常见性质和变体值得探讨。 所谓操作的性质,在扑克牌数学魔术的语境下&#x…

公务员事业编【判断推理】 之“逻辑判断” 个人NOTE

目录 1、翻译推理 1.1 翻译规则之“前推后” 1.2 翻译规则之“逆否等价” 1.3 翻译规则之“后推前” 1.4 且和或 2、组合排列(代入法/排除法) 3、日常结论 4、逻辑论证 4.1 加强类 4.1.1 搭桥(论证力度最强) 4.1.2 补充…

系统架构设计师 - 软件架构设计(2)

软件架构设计 软件架构设计(20多分)最重要基于架构的软件开发 ★ ★ ★概念开发过程架构需求、设计过程架构文档化架构复审架构实现、演化过程 软件质量属性 ★ ★ ★ ★ ★软件架构评估 ★ ★ ★ ★ ★概念架构评估方法评估方式基于场景的评估方法 软件…

EmguCV学习笔记 VB.Net 9.1 VideoCapture类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

人工智能开发实战MNIST数据集及神经网络完全解析

内容提要 MNIST数据集简介神经元常用函数深度神经网络卷积神经网络介绍循环神经网络 一、MNIST数据集简介 数据集(Dataset)是一类数据的集合。传统的数据集通常表现为表格或者文档形式,每个数值被称为数据资料。 MNIST数据集是一个含有手写…

ARM32开发——(二十四)电源管理单元

1. 重点 了解什么是电池管理单元PMU了解ARM32中的电源域了解几种省电模式 2. 主要内容 2.1 PMU PMU全称Power Management Unit,电源管理单元。 2.2 电源域 总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。 2.2.1 VDD/VDDA域 VDD/…

2024最新最全:网络安全软件大合集(非常详细)零基础入门到精通,收藏这一篇就够了

安全建议:渗透类软件,建议先在虚拟机试运行! VMware虚拟机 https://pan.quark.cn/s/6e439e2c15c1 下载KALI(安装版) https://pan.quark.cn/s/2124bdf3c732 下载KALI(免安装版) https://pa…

解决警告【WARNING: Ignoring invalid distribution -xxx 】

1、问题发生 出现警告【WARNING: Ignoring invalid distribution -umpy (c:\programdata\anaconda3\lib\site-packages)】 2、解决方法 进入报错文件夹 ,删除相关文件夹 3、解决效果

【C++标准模版库】模拟实现容器适配器:stack、queue、priority_queue(优先级队列)

stack和queue 一.容器适配器1.什么是适配器 二.模拟实现stack和queue三.STL标准库中stack和queue的底层结构四.deque(双端队列)的简单介绍五.deque作为stack和queue的默认容器的原因六.priority_queue(优先级队列)的介绍和使用七.…

前端性能优化--元素类型和dom层级

展示相同布局,使用控制变量法,对比性能差距 1. 结论:用块级元素模拟行内元素时,会有性能浪费,所以能用行内元素的,就不要使用块元素(能用span就不用div) 2. 结论:行内元素模拟块级元素时&…

rk3588_dp调试

配置流程&#xff1a; 开启usbusb需要绑定dpdp绑定vp 查看rk3588内部寄存器可知 需要在USB3.0控制器中打开DP0 在设备树中需要在usb3dp端口。 usbc0: fusb3024e { ......ports {port1 { reg <1>; …

SpringBoot配置MybatisPlus

文章目录 介绍特性工作流程图添加依赖Spring Boot2Spring Boot3 配置定义Mapper接口并继承BaseMapperServer 接口自定义 Service 接口继承 IServie 接口自定义 Service 实现类&#xff0c;实现自定义接口并继承 ServiceImpl 添加Config类 介绍 MyBatis-Plus 是一个 MyBatis 的…

uniapp钱包支付、与设置密码页面

设置密码页面 <template><view class="paymentCodeBox"><!-- 自定义键盘 -->

计算机毕业设计推荐-基于python的电子图书馆数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的电子图书馆数据…

95.WEB渗透测试-信息收集-Google语法(9)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;94.WEB渗透测试-信息收集-Google语法&#xff08;8&#xff09; • site &#xff1a; x…

nacos集群部署和VIP部署

1. 准备工作 nacos版本2.2.1 nginx版本1.24.0 2. nacos集群部署 2.1 下载nacos版本后&#xff0c;解压&#xff0c;然后复制三份nacos 2.2 分别修改三个nacos文件下config目录下的application.properties文件&#xff0c;三个nacos的端口修改为8846,8848,8850。 2.3 修改c…