C++线性表、单链表

news2024/11/25 10:42:56

概述

在先说链表前,我们先来理清几个概念。

什么是线性表、顺序表和链表?三者有什么关系?

线性表:元素线性排列,在逻辑上具有次序的存储结构。

顺序表:线性表的顺序存储称为线性表。它是用一组地址连续(逻辑上连续、物理上也连续)的存储单元依次存储线性表中的数据元素。比如,数组。

链表:线性表的链式存储称为线性表。由一任意的存储单元来存储线性表中的数据元素。存储单元只是在逻辑上连续,在物理地址上可以不连续。

三者关系:顺序表和链表都是线性表,顺序表和链表的存储结构不同。

在这里插入图片描述

什么是逻辑上连续?什么又是物理上连续?

我们都知道,程序使用的数据都存放在一块存储空间中。为了便于在存储空间中查找我们存储的数据,我们会给这段存储空间进行地址编号,类似家庭住址。

物理上连续:存储地址编号相邻。这样地址不同地址,就能顺序访问所有元素。

逻辑上连续:不要求存储地址编号相邻,但要求根据前一个数据地址,能找到下一个逻辑连续的数据地址。

举个例子:

现在我们要存储A,B,C,D 。要求,依次访问A,B,C,D。

在这里插入图片描述

对于顺序存储,我们将A存放在地址为100的位置,那么B,C,D的地址就确定下来了,依次是101,102,103。这样依次访问A,B, C, D就是从编号为100的位置依次取出四个数据。

对于链式存储,我们也把A存放在地址为100的位置,由于A,B,C,D只要求逻辑上连续,不要求物理地址连续。所以我们并不能由A的地址,推出B,C,D的地址。但我们会将A,B,C,D链接起来,这样也可以实现访问A后依次访问B,C,D。

顺序表

数组是一种常用的顺序表。

你还我们当初为什么会引出数组吗?数组的提出是为了解决什么问题》

简单的说,数组可以存储大量的、相同数据类型的数组。比如,我需要记录一个10个整数的值,我们就可以创建一个大小为10的整型数组 a [ 10 ] a[10] a[10], 这个十个整型依次就是 a [ 0 ] , a [ 1 ] , a [ 2 ] . . . , a [ 9 ] a[0],a[1],a[2]...,a[9] a[0],a[1],a[2]...,a[9]

数组支持随机访问,给出元素的下标i,直接通过a[i]就可访问元素,无需从第一个元素依次遍历,直至第 i 个元素。

单链表

介绍一个我们最场使用的链表,就是单链表。

什么是单链表?单链表被提出是为了解决什么问题的?它有什么特点?

首先,我们先来看看顺序表有什么不足吧?

(1)数组大小固定。创建数组的时候,创建数组时必须给出数组的大小。

  • 现在有这么个需求,让你从读入用户输入的数字,用户输入的数字的个数在 1 − 1000 1-1000 11000 之间。为了使数组够用,我们得就会这样创建数组int a[1000]; 但你发现,大多数用户,只输了10多个数字,只有个别用户会输入1000个数字,很多时候数组都设置大了,导致有很多设置的空间都没用上,浪费了空间。如何解决?

(2)插入、删除数据复杂。每次在数组中插入或者删除数据,都要不停的移动数据,来移出或填补空位,太浪费时间了,如何解决?

你可能已经猜到了,单链表能很好得解决上面的问题。接下来,然我们来见识见识它。

什么是单链表?

还是那个问题,读入用户的输入的数字,用户输入数字的个数在1-1000之间。

我们可以这样读,每次读入一个整数,用int 型的数据变量存储。但这样就有大量的变量,如何保证这些变量的次序关系呢?

能不能用一个链条把这些变量链接起来呢,串成一个表。每次有新的输入,我们就设置个变量读入,然后加入这个表中。

在这里插入图片描述

如何将这些数据链接起来呢?想一想哪个让我们很费解的,大名鼎鼎的“指针”,它就可以。

指针,存放数据地址的一种数据。可看成,指向了数据。

在这里插入图片描述

如果想到这,那说明你已经懂了单链表70%的内容了。

单链表,就是由一个个链表结点链接而成的数据结构。

结点由两部分组成,存放数据的数据域,和用来链接表的指针域

在这里插入图片描述

结点类型的描述如下:

// 链表结点
struct LNode{
    DataType data;		// 存放数据
    struct LNode *next;	// 指向下一个链表结点
};

对于任意一个非空结点node,我们知道它存放的数据为node.data或node->data ,它的下一个结点为nextnode = node.next或nextnode = node->next

对于ABCD存放结构图如下:

在这里插入图片描述

查找C,得先依次访问A、B

单链表的特点

每个结点只能访问到它的下一个结点,所以结点只能一个接一个依次访问,不支持随机访问,单链表的查找速度变慢了。

每次插入数据,只需创建一个新结点,然后调节结点的next指针,就实现了插入。

比如,在BC间插入个E。

在这里插入图片描述

特殊的,对于链表的尾结点(最后一个结点),指针的指向?

链表尾结点的next指针指向空(NULL)

这样,当遍历到的结点的next指针为空时,我们就知道此时已经遍历到链表的尾结点了,即链表已经遍历完了。

上面我们提到了尾结点,你可能会提出那有没有首结点呢?

有,我们一般称为头结点

上面的A结点是不是就是头结点呢?

一般,我们认为头结点是不存放数据,所以A我们不认为是头结点。那头结点有什么用?

可以存放链表的长度,即链表的结点个数。当然,也可以什么元素都不存。但头结点,一定有个指针指向链表中第一个存放数据的结点。

添加头结点后的链表。

在这里插入图片描述

对于一个链表,头结点为head。如果head->next == NULL 说明链表为空链表。因为该链表没有存放数据的结点。

其实,头结点还有很多好处,他会让很多的操作统一,减小很多特殊判断。不展开说了。如果你发现链表操作需要很多特判,想想是否可以加一个头结点。

顺序表和链表的比较

在这里插入图片描述

总结

这里具体的单链表的插入、删除、查找操作都没讲。其实,如果能理解单链表这个结构,对于这些基本操作还是很简单的。

单链表是一种常用的一种基本数据结构,重点就是理清楚结点指针

双链表、循环链表和循环双链表这里没提,其实先搞懂单链表,之后的其他特殊链表都很好理解。

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

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

相关文章

抖音短视频seo源码开发部署-技术分享(四)

一、 抖音短视频seo源码开发流程 抖音短视频SEO源码开发流程如下: 1.分析需求:首先需要明确你的SEO目标。分析竞争对手,了解抖音短视频平台的规则,选定目标关键词和主题。 2.编写代码:根据需求编写代码,…

docker 安装向量数据库 Milvus

Miluvs 官网为 www.milvus.io/ Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据(图片 / 视频 / 语音 / 文本)检索。单节点 Milvus 可以在秒内完成十亿级的向量搜索(请参考:在线教程),分布式架构亦…

This application failed to start?

大家好,最近在搞一个定制的图像分割项目,其中需要自己构建数据集。 这里我用到了基于paddle开发高效智能的交互式分割标注软件 EISeg(Efficient Interactive Segmentation)。 它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另…

低代码——现代数字化人才培养的创新引擎

如今,随着数字时代的蓬勃发展,催生了各行各业数字化转型的浪潮。如果说技术是衍生数字时代的基石,那数字化人才一定是这场浪潮中不可或缺的推动力量。 随着新兴技术的不断创新和应用,全行业对于复合型、创新型的优秀数字化人才需…

四种常见分布式限流算法实现!

大家好,我是老三,最近公司在搞年终大促,随着各种营销活动“组合拳”打出,进站流量时不时会有一个小波峰,一般情况下,当然是流量越多越好,前提是系统能杠地住。大家都知道,一个分布式…

css 网页色调变为黑白

在html的css中加入 filter: grayscale(1);

Java Springboot设置MySQL的ssl连接访问

一、需求背景 需要修改应用程序通过SSL连接mysql数据库。 环境配置 数据库:MySQL 8.0.21 (enabled SSL) Java版本:openjdk version "1.8.0_332" Springboot版本:v2.5.3 二、生成证书 下面是MySQL数据库服…

提升1Panel的安全性:在Armbian上设置个性化SSL证书

文章目录 基础知识OpenSSLOpenSSL常用命令SSL证书与DDoS攻击SSL证书常见办法机构 armbian安装OpenSSLOpenSSL下载和安装生成私钥和证书生成私钥和证书提示信息的解释challenge password 可能遇到的错误 安装完成后的思考完整的操作演示 基础知识 OpenSSL OpenSSL是一个开源的…

软件工程——第11章面向对象设计知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.什么是面向对象设计(OOD)? 2.优秀设计的主要特点是? 3.面向对象设计应遵循的准则有哪些&#xff1f…

检验样本正态性

简介 在统计学中很多推论与正态分布有关,并且很多统计量构造为满足正态分布的形式,很多分布在特定条件近似于正态分布。因此,在统计推断中经常需要判断样本的正态性。本文介绍一些常用的方法。 环境和数据准备: import numpy a…

CCLINK IE FIELD BASIC转MODBUS-TCP网关modbus tcp与tcp/ip的区别

协议的不同,数据读取困难,这是很多生产管理系统的难题。但是现在,远创智控YC-CCLKIE-TCP通讯网关,让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中,连接到MODBUS-TCP…

在 Jetpack Compose 中使用 BottomDrawer

简介 Jetpack Compose 是一个现代化的,声明式的 UI 工具包,它让我们可以更方便地构建原生 Android UI。在本篇文章中,我们将会讨论如何在 Jetpack Compose 中使用 BottomDrawer。 什么是 BottomDrawer? BottomDrawer 是一种 UI 元素&…

【JAVA】准备工作------Java开发环境搭建,IDEA的基础设置与操作

🍉内容专栏:【JAVA】 🍉本文脉络:JAVA的准备工作,IDEA的安装以及基础设置和快捷操作 🍉本文作者:Melon西西 🍉发布时间 :2023.7.11 目录 1. 概述JDK、JRE 2. 第一个程序——创建…

Win10电脑插耳机没声音了如何恢复正常?

Win10电脑插耳机没声音了如何恢复正常?当Win10电脑插入耳机后却没有声音时,这可能会让用户感到困惑和沮丧,缺乏耳机声音可能会影响到用户的音频体验和日常使用,那么要怎么如何操作,才能让耳机恢复正常,以下…

webpack的打包流程

webpack的打包流程 yarn build 开始都走了哪些流程 yarn build 开始都走了哪些流程

软考A计划-系统集成项目管理工程师-项目进度管理-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

1. 效果图 2. 组件完整代码 <template><view class="custom-picker"><view :class=<

2023数学建模国赛常用算法-Topsis优劣解距离法

更多国赛数学建模资料思路&#xff0c;关注文末&#xff01; 1 优劣解距离法&#xff08;TOPSIS&#xff09;简介 1.1 概念 TOPSIS 法是一种常用的组内综合评价方法&#xff0c;能充分利用原始数据的信息&#xff0c;其结果能精确地反映各评价方案之间的差距。基本过程为基于…

avue 自定义按钮修改后触发表单自带的校验方法

代码&#xff1a; <avue-form :option"option" v-model"publishForm" ref"publishForm"><template slot-scope"{size}" slot"menuForm"><el-button :size"size" click"$refs.publishForm.re…

【RuoYi-Cloud-Plus】学习笔记 09 - Sentinel(四)熔断降级知识整理

文章目录 前言参考目录版本说明学习笔记1、包结构2、DegradeSlot3、DegradeRule4、DegradeRuleManager5、CircuitBreaker5.1 CircuitBreaker.State6、AbstractCircuitBreaker6.1、AbstractCircuitBreaker#fromCloseToOpen6.2、AbstractCircuitBreaker#fromHalfOpenToOpen6.3、A…