【数据结构】线性表--顺序表(二)

文章目录

        • 1、什么是线性表
        • 2、线性表的基本操作
        • 3、顺序表
          • 3.1、顺序表的定义
          • 3.2、顺序表的实现方式:静态分配
          • 3.3、顺序表的实现方式:动态分配
          • 3.4、顺序表的特点
          • 3.5、顺序表的初始化与插入操作
          • 3.6、顺序表的删除与查询

1、什么是线性表

​ 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表,若用L命名线性表,则其一般表示为

​ L = (a1,a2,…,ai,ai+1,…,an

如图所示:

image-20240506222820628

每个数据类型都相同,也意味着每个数据元素所占空间一样大

重要概念:

  1. ai是线性表中的“第i个”元素线性表中的位序
  2. a1是表头元素;an是表尾元素
  3. 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继
2、线性表的基本操作

常用操作:

  • InitList(&L):初始化表。构造一个空的线性表L,分配内存空间
  • DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
  • ListInsert(&Li,e):插入操作。在表L中的第i个位置上插入指定元素e。
  • ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
  • LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素
  • GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。

其他常用操作:

  • Length(L):求表长。返回线性表L的长度,即L中数据元素的个数
  • PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
  • Empty(L):判空操作。若L为空表,则返回true,否则返回false。

Tips:

  1. 数据元素的位序是从1开始,而程序数组下标是0开始
  2. 在实际开发中,可根据实际需求定义其他的基本操作
3、顺序表
3.1、顺序表的定义

​ 顺序表指的是用顺序存储的方式来实现线性表的顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

image-20240507105149070

3.2、顺序表的实现方式:静态分配
#define MaxSize 10		//定义最长长度
typedef struct{ElemType data[MaxSize];	//用静态的数组存放数据int length;				//顺序表当前长度
}SqList;		//顺序表的类型定义(静态分配方式)

**问题:**如果数组数组存满了呢?

  • 直接放弃治疗,顺序表的表长刚开始就确定后,无法更改(存储空间是静态的)

**思考:**如果刚开始就声明一个很大的内存空间呢?存在什么问题?

  • 过于浪费
3.3、顺序表的实现方式:动态分配
#define InitSize 10		//顺序表的初始长度
typedef struct{ElemType *data;	//指示动态分配数组的指针int MaxSize;	//顺序表的最大容量int length;		//顺序表的当前长度
}SeqList;		//顺序表的类型定义(动态分配方式)
3.4、顺序表的特点
  1. 随机访问,即可以在o(1)时间内找到第i个元素
  2. 存储密度高,每个节点只存储数据元素
  3. 拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
3.5、顺序表的初始化与插入操作

初始化顺序表

#define MaxSize 50
typedef int ElemType; //让顺序表存储其他类型元素时,可以快速改变代码
//静态分配
typedef struct {ElemType data[MaxSize];int length; //顺序表长度
}SqList;

顺序表插入

//顺序表插入,因为L会改变,所以要引用
bool ListInsert(SqList &L,int pos,ElemType elemType){//判断pos是否合法if(pos <= 1 || pos >= L.length + 1){return false;}//如果顺序表满了,也不能进行插入if(L.length == MaxSize){return false;}//将元素依次往后面移动for (int i = L.length; i >= pos; i--) {L.data[i] = L.data[i-1];}L.data[pos-1] = elemType; //存入数据L.length++;       //顺序表长度+1return true;}

打印顺序表

//打印顺序表
void PrintList(SqList L){for (int i = 0; i < L.length; ++i) {printf("%3d",L.data[i]);}
}

在主函数中调用

//顺序表的初始化与插入
int main() {SqList L;  //定义一个顺序表bool result;L.data[0] = 1;  //放置元素L.data[1] = 2;L.data[2] = 3;L.length = 3; //设置顺序表元素为3result = ListInsert(L,2,2);if(true == result){printf("success");} else{printf("error");}PrintList(L);return 0;
}
3.6、顺序表的删除与查询

删除元素

//删除顺序表中的元素
bool ListDelete(SqList &L,int pos,ElemType &del){//判断删除元素位置是否合法if(pos < 1 || pos > L.length ){return false;}del = L.data[pos-1];  //保存删除元素的值//从当前下标开始,往前移动for (int i = pos;  i < L.length; i++) {L.data[i - 1] = L.data[i];}L.length--;return true;
}

查询元素

//查询元素位置
int LocateElem(SqList L,ElemType elemType){//遍历顺序表for (int i = 0; i < L.length; ++i) {if(L.data[i] == elemType){  //如果元素相同return i+1; //返回下标+1}}return 0;
}

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

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

相关文章

【Python快速上手(二十二)】

目录 Python快速上手&#xff08;二十二&#xff09;Python3 使用数据库-pymysql1. 创建数据库连接2. 创建数据表3. 插入数据4. 查询数据5. 使用 WHERE 条件语句6. 排序7. 删除记录8. 更新表数据9. 删除表10.异常处理总结 Python快速上手&#xff08;二十二&#xff09; Pytho…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

Flet初体验:Python跨平台开发新选择

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 初识Flet 📒📝 安装与配置📝 构建第一个Flet应用📝 Flet打包:跨平台的魔法📝 Flet与FastAPI的结合🎈 总结⚓️ 相关链接 ⚓️📖 介绍 📖 “探索未知,拥抱创新,Flet让我在应用开发的世界中找到了新的航标。”…

02 | 该如何选择消息队列?

RabbitMQ RabbitMQ 一个比较有特色的功能是支持非常灵活的路由配置&#xff0c;和其他消息队列不同的是&#xff0c;它在生产者&#xff08;Producer&#xff09;和队列&#xff08;Queue&#xff09;之间增加了一个 Exchange 模块&#xff0c;你可以理解为交换机。 问题 Ra…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

浅谈电动汽车充电站的电气安全

1 引言 1月14日日上午10点左右&#xff0c;青岛市市北区辽宁路63号公交停车场内&#xff0c;一辆报废公交车突然起火&#xff0c;由于大风天气&#xff0c;大火很快引燃了停在旁边的几辆报废车。消防人员快速赶到&#xff0c;迅速控制住火势。11时30分&#xff0c;停车场内的…

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!

前言 我们之前肯定已经见过了很多文本生成图片、文本生成声音以及AI翻唱歌曲 等多种AI产品&#xff08;模型&#xff09;。 其实音乐和图片从某种意义上来说都是艺术创作的一种形式&#xff0c;它们可以相互配合&#xff0c;共同呈现出一种更加丰富、感性的表达方式。 将图片…

弘君资本:人形机器人概念走强,盛通股份涨停,怡合达、鼎智科技等拉升

人形机器人概念14日盘中拉升走高&#xff0c;到发稿&#xff0c;盛通股份涨停&#xff0c;怡合达、鼎智科技涨约6%&#xff0c;索辰科技、伟创电气、丰立智能等涨超4%。 音讯面上&#xff0c;5月13日&#xff0c;宇树发布人形智能体Unitree G1&#xff0c;身高127cm,体重35kg&…

[240514] OpenAI 发布 GPT-4o,人机交互的历史性时刻 | 苹果芯片进军服务器剑指AI​ | 谷歌大会以AI为主

目录 OpenAI 发布 GPT-4o&#xff0c;人机交互的历史时刻苹果芯片进军服务器&#xff0c;剑指生成式 AI2024年谷歌开发者大会将围绕 AI 展开 OpenAI 发布 GPT-4o&#xff0c;人机交互的历史时刻 OpenAI 发布了 GPT-4o&#xff0c;大家一直都想要现在终于等到的语音助手 : 勿需…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…

易宝OA-ExecuteQueryForDataSetBinary处sql注入

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责&#xff0c;与作者无关&#xff01;&#xff01;&#…

Centos 安装jenkins 多分支流水线部署前后端项目

1、安装jenkins 1.1 安装jdk 要求&#xff1a;11及以上版本 yum install yum install java-11-openjdk 1.2 安装jenkins 导入镜像 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo出现以下错误 执行以下命令 sudo yum …

前端使用原生JS怎么上传本地路径的文件到后端【附源码】

本文不使用<input type"file">等前端上传组件 一、为什么不能使用本地文件路径上传&#xff1f; 前端不能直接根据本地文件路径&#xff08;例如 C:\Users\Username\Documents\image.jpg&#xff09;上传文件到后端服务器&#xff0c;原因主要在于浏览器的安全…

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

谈谈std::map的lower_bound

我们知道std::map内部是一个红黑树&#xff0c;放到std::map里的数据等有一个能比较大小的方法。它相当于java里面的TreeMap。 它里面有个lower_bound方法&#xff0c;返回一个迭代器&#xff0c;它指向map里第一个大于等于参数的元素。 方法的签名很简单&#xff0c;但是在不同…

富格林:有效预防黑幕阻挠被骗

富格林指出&#xff0c;在投资领域&#xff0c;现货黄金是一种备受推崇的贵金属投资品种。倘若能有效预防黑幕阻挠被骗的情况&#xff0c;事实上现货黄金是很多投资者的“理想型”。然而要想有效地预防黑幕阻挠被骗&#xff0c;就需要掌握足够多的投资技巧。为此&#xff0c;富…

Milvus 基本概念

Milvus 是一个开源的向量数据库&#xff0c;专门用于高效地存储、管理和检索大规模向量数据。它基于 Apache 许可证 2.0 版本发布&#xff0c;由 Zilliz 公司开源并维护。 Milvus 的设计理念是为了解决向量数据存储和检索的挑战。在许多应用中&#xff0c;向量数据是一种重要的…