数据结构详解---顺序表

news2024/9/22 13:32:41

在这里插入图片描述
🌏个人博客主页:意疏-CSDN博客
在这里插入图片描述

希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~

阅读指南:

  • 开篇说明
    • 线性表的定义
    • 线性表的顺序存储结构(顺序表)
    • 顺序存储结构的插入与删除(顺序表)
    • 插入操作
    • 删除操作
    • 线性表顺序存储结构的优缺点


开篇说明

数据结构是组织和存储数据的一种方式,它不仅定义了数据的类型,还规定了数据之间的关系以及对数据进行操作的方法。线性表是一种基本的数据结构,用于存储一组有序的数据元素。线性表中的元素具有线性关系,即每个元素有且只有一个前驱和一个后继(除了第一个元素没有前驱和最后一个元素没有后继)。线性表可以分为顺序存储结构和链式存储结构两种实现方式。
在这里插入图片描述

在本篇中,我们将深入探讨线性存储中顺序表的实现细节、基本操作(如插入、删除、查找),通过这些内容的学习,希望我们可以一起进步。


线性表的定义

线性表:是具有相同数据类型为n(n>=0)个数据元素的有限序列,它是典型的线性结构。除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。
这里首先要强调的是,首先它是一个序列,也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继。元素的个数是有限的。
如用数字语言来进行定义,若将线性表记为( a 1 a_1 a1,…, a i a_i ai-1,a, a i a_i ai+1,…, a n a_n an
则表中 a i a_i ai-1领先于 a i a_i ai a i a_i ai领先于 a i a_i ai+1,我们称 a i a_i ai-1是 a i a_i ai的直接前驱, a i a_i ai+1是 a i a_i ai的直接后继元素。当i = 1,2,n-1时, a i a_i ai有且仅有一个直接后继,当i = 2,3,n时, a i a_i ai有且仅有一个直接前驱。

  • 这里是示例图:
    在这里插入图片描述
    所以线性元素的个数 n n(>=0) 定义为线性表的长度,当n=0时,称为空表。

在非空表中的每个数据元素都有一个确定的位置,如 a 1 a_1 a1是第一个数据元素, a n a_n an是最后一个数据元素, a i a_i ai是第i个数据元素,称i为数据元素 a i a_i ai在线性表中的位序。

在较复杂的线性表中,一个数据元素可以由若干个数据项组成。

  • 线性表的抽象数据类型定义如下:
    在这里插入图片描述
    在实际问题中,关于线性表的更复杂操作,完全可以用这些基本的操作组合来实现。
  • 例如,实现两个线性表集合A和B的并集操作。即要使得集合A = A ∪ \cup B
    简单来说就是把存在集合B但不存在A中的数据元素插入到A中即可。
    我们只要循环集合B中的每个元素,判断当前元素是否存在A中,若不存在,则插入A即可。
    我们假设 L a L_a La表示集合A, L b L_b Lb表示集合B,则实现的代码如下:

在这里插入图片描述
这里,我们对于union操作,用到了前面线性表基本操作ListLength、GetElem、LocateElem、ListInsert等,其实复杂的操作,其实就是把基本操作组合起来实现的。


线性表的顺序存储结构(顺序表)

我们来看一下线性表的两种物理结构的第一种:顺序存储结构
线性表的顺序存储结构是指:用一段地址连续的存储单元依次存储线性表的数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻

线性表( a 1 a_1 a1 a 2 a_2 a2,…, a n a_n an)的顺序存储示例图如下:
在这里插入图片描述
线性表的顺序存储结构,就是在内存中找地方,通过占位的形式,把一定内存空间给占掉了,然后把相同数据类型的数据元素依次存放在这片空地中。线性表的每个数据元素的类型都相同,所以可以用C语言的一维数组来实现顺序存储结构。即把第一个数据元素存储到数组下标为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置。

。数组的分配,在正常情况下是静态分配,但我们也可以动态分配。

  • 我们首先来看静态分配
  • 静态分配:数组大小和空间已经固定,一旦空间占满,再加入新的数据,就会产生溢出,导致程序崩溃(空间固定)
#define MaxSize 100//存储空间初始分配量
typedef struct {
    ElemType data[MaxSize];//数组存储数据元素,最大值为MAXSIZE
    int length;//线性表当前长度
} SeqList;

这里我们可以发现描述顺序存储结构需要三个属性:
1. 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
2. 线性表的最大存储容量:数组长度MaxSize
3. 线性表的当前长度:length

这里我们需要注意的是:
数组的长度与线性表的长度两者的区分:
数组的长度是存放线性表的存储空间的长度,存储分配后这个量是一般是不会变的。
线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是会变化的。
在任何时刻,线性表的长度都需要小于等于数组的长度

  • 我们再来看动态分配:
  • 动态分配:存储数据的空间在程序执行中动态语句分配,一旦空间占满,可以另外开辟更大空间,用来替换原始空间。(空间不固定)
#define InitS 100
typedef struct {
    ElemType *data;//包含的数组
    int length;//当前表中有几个元素
} SeqList;

顺序存储结构的插入与删除(顺序表)

获得元素操作
对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回。就程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
//Status是函数的类型,其值是函数结果状态代码,如OK等。
//初始条件:顺序线性表L已存在,1<=i<=ListLength (L)。
//操作结果:用e返回L中第i个数据元素的值。
Status GetElem(SqList L, int i, ElemType *e) 
{
    if (L.length == 0 || i < 1 || i > L.length)
        return ERROR;
    *e = L.data[i-1];
    return OK; 
}
  • 注:
    这里返回值类型是Status 是一个整型,返回OK代表1,ERROR代表0

插入操作

我们要实现ListInsert(*L,i,e),就是将线性表L中的第i个位置插入新元素e。
插入算法的思路:

  1. 如果插入位置不合理的话,抛出异常。
  2. 如果线性表长度大于或等于数组长度,则抛出异常或动态增加容量。
  3. 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
  4. 将要插入的元素填到位置 i 处。
  5. 表长加1。
  • 代码如下:
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
Status ListInsert(SqList *L, int i, ElemType e) 
{
    int k;
    if (L-> length == MAXSIZE)//顺序线性表已满
        return ERROR;
    if (i < 1 || i > L-> length + 1) //当i不在范围内时,返回错误
        return ERROR;
    if (i <= L-> length)//若插入位置不在表尾
    {
        for (k = L-> length; k >= i-1; k--)//将后面的元素后移一位
            L-> data[k+1] = L-> data[k];
    }
    L-> data[i-1] = e; //插入新元素
    L-> length++; //表长加1
    return OK;
}

删除操作

删除算法的思路:

  1. 如果删除位置不合理的话,抛出异常。
  2. 取出删除元素
  3. 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。
  4. 表长减1。
  • 代码如下:
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
Status ListDelete(SqList *L, int i, ElemType *e) 
{
    int k;
    if (L-> length == 0)//线性表为空时,返回错误
        return ERROR;
    if (i < 1 || i > L-> length) //删除位置不正确
        return ERROR;
    *e = L-> data[i-1]; //返回被删除元素的值
    if (i <L-> length)//若插入位置不在表尾
    {
        for (k=i;k = L-> length; k++)//将删除位置后继元素前移
            L-> data[k-1] = L-> data[k];
    }
    L-> length--; //表长减1
    return OK;
}

线性表顺序存储结构的优缺点

优点

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
  • 可以快速地存取表中任一位置的元素。

缺点

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的‘碎片’

你好,我是意疏。一起进步。

在这里插入图片描述


意气风发,漫卷疏狂
学习是成长的阶梯,每一次`的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中

如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo
我是意疏 下次见!

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

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

相关文章

ozon本土店和跨境店什么区别

Ozon 本土店和跨境店有以下区别&#xff1a; 运营模式&#xff1a;本土店&#xff1a;主要针对俄罗斯国内买家&#xff0c;商品来源于俄罗斯国内供应商。跨境店&#xff1a;针对俄罗斯的海外买家&#xff0c;商品主要来源于海外供应商。物流管理&#xff1a;本土店&#xff1a…

unity GridLayoutGroup真正的居中

GridLayoutGroup默认的居中效果: 不是真正的居中 加上代码: namespace UnityEngine.UI {/// <summary>/// GridLayoutGroup拓展&#xff0c;使支持自定义内容/// </summary>internal class GridLayoutGroupEx : GridLayoutGroup{/// <summary>/// 启用居中/…

将语义分割的标签转换为实例分割(yolo)的标签

语义分割的标签&#xff08;目标处为255&#xff0c;其余处为0&#xff09; 实例分割的标签&#xff08;yolo.txt&#xff09;,描述边界的多边形顶点的归一化位置 绘制在原图类似蓝色的边框所示。 废话不多说&#xff0c;直接贴代码&#xff1b; import os import cv2 imp…

【高阶数据结构】二叉树的创建、存储方式(顺序与链式)、遍历方法(递归与非递归)(精美图解+完整代码)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…

单体到微服务:架构变迁

单体架构与微服务架构&#xff1a;从单体到微服务的演变 引言单体架构概述微服务架构的优势一、功能定位二、使用场景三、配置方式四、性能特点Eureka - 服务注册与发现框架核心功能工作原理优势应用场景 结论 引言 在软件开发的世界中&#xff0c;随着业务的增长和技术的发展…

RabbitMQ 基础架构流程 数据隔离 创建用户

介绍 publisher&#xff1a;消息发送者-exchange&#xff1a;交换机&#xff0c;复制路由的消息-queue&#xff1a;队列&#xff0c;存储消息consumer&#xff1a;消息的消费者 工作流程 publisher消息发送者 -> exchange 交换机 -> queue 队列 -> consumer 消息的消…

关于CUDA版本查看的问题

显卡驱动安装成功后&#xff0c;通过nvidia-smi命令查看显卡信息 右上角显示的CUDA Version&#xff1a;12.1并非本机的 CUDA 版本&#xff0c;而是 GPU 最高支持的 CUDA 版本&#xff0c;本机安装的CUDA版本不能高于GPU最高支持的版本。 通过nvcc --version查看到的版本才是本…

SprinBoot+Vue图书管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

MapBox Android版开发 3 地图样式v11

MapBox Android版开发 3 地图样式v11 前言MapBox样式对比主要类和方法Style类Style类默认的MapBox样式OnStyleLoaded 接口 MapboxMap类获取样式设置样式 本地化扩展 示例代码地图样式类界面布局控件响应事件运行效果图 附不同样式中的图层 前言 可以使用Mapbox Maps SDK自定义…

LLM大模型教程:低使用门槛开源大模型服务框架Ollama

这一年来&#xff0c;AI 发展的越来越快&#xff0c;大模型使用的门槛也越来越低&#xff0c;每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——Ollama。 项目介绍 Ollama 是一个开源的大语言模型&#xff08;LLM&#xff09;服务工具…

平价运动耳机推荐有哪些?业界五大爆款推荐!

近两年&#xff0c;开放式蓝牙耳机的热度可以说是不断提高&#xff0c;相较于一般的蓝牙耳机&#xff0c;开放式蓝牙耳机因为不需要入耳&#xff0c;对于耳道狭小或者耳道敏感的人群比较友好&#xff0c;能够避免耳道不适、中耳炎等&#xff0c;长时间佩戴更舒适&#xff0c;适…

【一嗨租车-注册安全分析报告-滑动验证加载不正常导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

大模型时代,开发者怎么办

随着ChatGPT的出圈&#xff0c;基于大模型开发的应用也不断涌现&#xff0c;不管是不是相关方向的从业人员&#xff0c;在这一年多总能听到很多新名词&#xff0c;从LLM、Prompt、RAG到Fine-tuning、Agent&#xff0c;各个大企业都在讲All in AI&#xff0c;一些技术会议也明显…

Massive Exploration of Neural Machine Translation Architectures论文解读

基本信息 作者D Britzdoi发表时间2017期刊EMNLP网址https://arxiv.org/abs/1703.03906v1 研究背景 1. What’s known 既往研究已证实 神经机器翻译NMT是一种自动翻译的端到端方法&#xff08;Neural Machine Translation by Jointly Learning to Align and Translate论文里的…

Gartner《2024中国安全技术成熟度曲线》AI安全助手代表性产品:开发者安全助手D10

海云安关注到&#xff0c;近日&#xff0c;国际权威研究机构Gartner发布了《2024中国安全技术成熟度曲线》(Hype Cycle for Security in China,2024)报告。 在此次报告中&#xff0c;安全技术成熟度曲线将安全周期划分为技术萌芽期&#xff08;Innovation Trigger&#xff09;…

快捷开发技巧-idea如何提取代码成方法

1.首选选中要抽取的代码段 2.右键选择Refactor->Extract Method 3.调整方法名称 4.回车保存

Find My资讯|腾势联名九号推出F2 升级版电动滑板车,支持苹果Find My功能

比亚迪腾势与九号电动推出的联名电动滑板车 F2 升级版已在腾势商城上架&#xff0c;该车支持苹果“Find My”查找功能&#xff0c;续航里程 40 公里&#xff0c;售价为 2999 元。 该车配备 30 毫米双筒减振&#xff0c;采用 10 英寸自修复果冻胎&#xff0c;拥有前碟刹 后 E…

改变地址栏的网址链接路径或传参,不刷新当前网页页面

window.history.replaceState(null, null, "/网址后面的路径?参数参数值1");window.history.replaceState(null, null, "./当前路径保留?参数参数值1");

linux 系统中关于文件压缩效率/压缩比的说明

前言 tar.gz&#xff08;或tgz&#xff09;格式是Linux中常用的压缩格式&#xff0c;它结合了tar的打包功能和gzip的压缩功能。根据搜索结果&#xff0c;tar.gz格式在压缩比率、压缩和解压速度上取得了较好的平衡。 在一项测试中&#xff0c;一个大约23GB的目录使用tar.gz格式…

win7一键修复所有dll缺失!全面介绍电脑DLL文件丢失修复过程!

在Windows 7操作系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色。它们是Windows系统和其他应用程序正常运行所必需的组件。然而&#xff0c;由于各种原因&#xff0c;如系统更新不当、软件卸载不完全或恶意软件攻击&#xff0c;DLL文件可能…