当前位置: 首页 > news >正文

DS知识点总结--线性表定义及顺序表示

数据结构知识点汇总(考研C++版)

文章目录

  • 数据结构知识点汇总(考研C++版)
    • 二、线性表
      • 2.1 线性表的定义和操作
        • 2.1.1 线性表的定义
        • 2.1.2 线性表的基本操作
      • 2.2 线性表的顺序表示
        • 2.2.1 顺序表的定义
        • 2.2.2 顺序表上的基本操作的实现

二、线性表

2.1 线性表的定义和操作

2.1.1 线性表的定义

线性表是具有相线性表是具有相同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用工命名线性表,则其一般表示为同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用工命名线性表,则其一般表示为
L = ( a 1 , a 2 , ⋯ , a i , a i + 1 , ⋯ , a n ) L=(a_1,a_2,\cdots,a_i,a_{i+1},\cdots,a_n) L=(a1,a2,,ai,ai+1,,an)
式中,a是唯一的“第一个”数据元素,又称表头元素;a,是唯一的“最后一个”数据元素,又称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继(“直接前驱”和“前驱”、“直接后继”和“后继”通常被视为同义词)。
线性表的特点:

  • 表中元素的个数有限。
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序。
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。
  • 表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容

线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构两者属于不同层面的概念,因此不要将其混淆。

2.1.2 线性表的基本操作
InitList(&):初始化表。构造一个空的线性表。
Length():求表长。返回线性表工的长度,即1中数据元素的个数。
LocateElem(L,e):按值査找操作。在表中査找具有给定关键字值的元素。
Getelem(L,i):按位査找操作。获取表工中第i个位置的元素的值。
ListInsert(&,i,e):插入操作。在表工中的第i个位置上插入指定元素e 。ListDelete(&L,i,&e):删除操作。删除表工中第i个位置的元素,并用e返回删除元素的值 。Printzist():输出操作。按前后顺序输出线性表工的所有元素值。
Empty(L):判空操作。若为空表,则返回true,否则返回 falseDestroyList(&L):销毁操作。销毁线性表,并释放线性表工所占用的内存空间。

2.2 线性表的顺序表示

2.2.1 顺序表的定义

​ 线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在顺序表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素a在顺序表中的位序。因此,顺序表的特点是表中元素的逻辑顺序与其存储的物理顺序相同。
假设顺序表工存储的起始位置为LOC(A)sizeof(ElemType)是每个数据元素所占用存储空间的大小,则表所对应的顺序存储如图所示。

image-20240621164241419

​ 线性表的元素类型为 ElemType,则静态分配的顺序表存储结构描述为:

#define MaxSize 50
typedef struct{
ElemType data[MaxSize]; //顺序表的元素int length; //顺序表的当前长度
}SqList; //顺序表的类型定义

​ 一维数组可以是静态分配的,也可以是动态分配的。对数组进行静态分配时,因为数组的大小和空间事先已经固定,所以一旦空间占满,再加入新数据就会产生溢出,进而导致程序崩溃。而在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,将原表中的元素全部拷贝到新空间,从而达到扩充数组存储空间的目的,而不需要为线性表一次性地划分所有空间。动态分配的顺序表存储结构描述为:

#define InitSize 100   //表长度的初始定义
typedef struct{  ElemType *data;   //指示动态分配数组的指针int MaxSize,length; //数组的最大容量和当前个数
}SeqList; //动态分配数组顺序表的类型定义

C的初始动态分配语句为

L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

C++的初始动态分配语句为,

L.data=new ElemType[InitSize];

顺序表的主要优点:

  1. 可进行随机访问,即可通过首地址和元素序号可以在 0(1)时间内找到指定的元素
  2. 存储密度高,每个结点只存储数据元素。顺序表的缺点也很明显
  3. 元素的插入和删除需要移动大量的元素,插入操作平均需要移动 n/2 个元素,删除操作平均需要移动(n-1)/2个元素;
  4. 顺序存储分配需要一段连续的存储空间,不够灵活。
2.2.2 顺序表上的基本操作的实现

1、顺序表的初始化
静态分配和动态分配的顺序表的初始化操作是不同的。静态分配在声明一个顺序表时,就已为其分配了数组空间,因此初始化时只需将顺序表的当前长度设为0。

//sqList L; //声明一个顺序表
void Initlist(SqList &l){L.length=0; //顺序表初始长度为0
}

动态分配的初始化为顺序表分配一个预定义大小的数组空间,并将顺序表的当前长度设为 0。Maxsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足,就进行再分配。

void Initlist(Seqlist &){
L.data=(ElemType *)malloc(MaxSize*sizeof(ElemType)); //分配存储空间
L.length=0;   //顺序表初始长度为0
L.MaxSize=InitSize;//初始存储容量
}

2、插入操作
在顺序表工 的第i(1<=i<=.length+1)个位置插入新元素 e。若i的输入不合法,则返回 false,表示插入失败;否则,将第i个元素及其后的所有元素依次往后移动一个位置,腾出一个空位置插入新元素 e,顺序表长度增加 1,插入成功,返回 true。

bool ListInsert(SqList &l,int i,ElemType e){if(i<1||i>.length+1)return false; //判断i的范围是否有效if(1.length>=MaxSize)return false; //当前存储空间己满,不能插入for(int j=.length;j>=i;j--) //将第i个元素及之后的元素后移L.data[j]=L.data[j-1]; L.data[i-1]=e;L.length++;   //在位置i处放入e//线性表长度加1return true;
}

3、删除操作
删除顺序表1 中第i(1<=i<=L.length)个位置的元素,用引用变量e返回。若i的输入不合法,则返回 false;否则,将被删元素赋给引用变量 e,并将第 i+1 个元素及其后的所有元素依次往前移动一个位置,返回true。

bool ListDelete(SqList &l,int i,ElemType &e){if(i<1||i>.length)
//判断i的范围是否有效
return false;
e=L.data[i-1];  //将被删除的元素赋值给e
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;  //线性表长度减1
return true;

4、按值查找(顺序查找)
在顺序表工中查找第一个元素值等于e的元素,并返回其位序。

int LocateElem(SqListl,ElemType e){int i;for(i=0;i<L.length;i++)if(L.data[i]==e)//下标为i的元素值等于e,返回其位序i+1return i+1;
return 0; //退出循环,说明查找失败  

最好情况:查找的元素就在表头,仅需比较一次,时间复杂度为(1)。

最坏情况:查找的元素在表尾(或不存在)时,需要比较n次,时间复杂度为(n)。

相关文章:

DS知识点总结--线性表定义及顺序表示

数据结构知识点汇总(考研C版) 文章目录 数据结构知识点汇总(考研C版)二、线性表2.1 线性表的定义和操作2.1.1 线性表的定义2.1.2 线性表的基本操作 2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上的基本操作的实现 二、线性表 2.1 线性表的定义和操作 2.1.1 线性表的…...

百度文库AI产品“橙篇”:支持10万字长文生成,开启AI创作新篇章

6月19日&#xff0c;百度文库发布了一款创新产品「橙篇」&#xff0c;这一行业首创的产品集成了10万字长文生成及多模态编辑能力&#xff0c;成为首个实现「查阅创编」一站式AI自由创作平台的里程碑。 百度“橙篇”官网&#xff1a; 地址&#xff1a;橙篇AI - 用橙篇&#xf…...

wsl子系统ubuntu20.04 设置docker服务开机自启动

docker的重要性毋庸置疑。掌握虚拟化必备工具。windows台式机相信大家都有&#xff0c;那么开启windows的wsl子系统ubuntu来熟悉linux分布式开发就方便多了&#xff0c;用不着另购电脑。docker是在有限成本前提下尽可能多的尝试使用多OS、隔离物理环境影响的方便工具。下面就介…...

SAP ScreenPersonas

https://developers.sap.com/mission.screen-personas.html 跟着这个练习做一遍就了解了Personas 访问SAP提供的Personas练习系统 申请用户 登录练习系统 随便找一个可以支持Personas的程序搞起来&#xff0c;比如IW51 执行后等它出现这个图标就可以开始了....

充电学习—3、Uevent机制和其在android层的实现

sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs&#xff0c;userspace 可以主动去读写 kernel 的一些数据&#xff0c;同样的&#xff0c; kernel 也可以主动将一些“变化”告知给 userspace。也就是说&#xff0c;通过sysfs&#xff0c;userspace 和 ker…...

“河南省勘察设计资质整合趋势与企业应对“

"河南省勘察设计资质整合趋势与企业应对" 河南省勘察设计资质的整合趋势与企业应对策略可以从以下几个方面来分析&#xff1a; 整合趋势&#xff1a; 资质标准简化与合并&#xff1a;随着国家和地方政府深化“放管服”改革&#xff0c;勘察设计资质的管理趋向简化&…...

简单了解雪花算法

雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位&#xff0c;分别是 时间戳 服务器节点ID 序列号&#xff0c;每个数据项占的位数不固定&#xff0c;可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…...

决策树算法详细介绍原理和实现

决策树是一种常用的分类算法&#xff0c;它通过一系列的问题将数据分割成不同的分支&#xff0c;最终确定数据属于哪个类别。下面是决策树的原理、实现方式以及一个案例实现的详细介绍。 决策树原理 特征选择&#xff1a;决策树的构建过程首先需要选择一个特征作为节点&#…...

vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)

目录 第一章 vue2全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 1.2.1 require.context()方法解释 第二章 vue3全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 第一章 vue2全局注册公共组件 Vue…...

LoRa126X系列LoRa模块:专为物联网设计而生

LoRa126X是思为无线研发的一款应用于物联网应用的LoRa 前端模块系列&#xff0c;采用 Semtech 公司的 SX1262和SX1268 芯片。该系列模块具有小体积、低功耗&#xff0c;高灵敏度等特点&#xff0c;并且严格遵循无铅工艺生产和测试流程&#xff0c;符合 RoHS 和 Reach 环保标准。…...

个人职业规划(含前端职业线路、前端技术线路、前端核心竞争力、大龄程序员的出路)

1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标&#xff08;5年&#xff09; 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动&#xff0c;认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…...

【设计模式深度剖析】【10】【行为型】【状态模式】

&#x1f448;️上一篇:访问者模式 | 下一篇:解释器模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 状态模式定义英文定义直译如何理解呢&#xff1f; 状态模式的角色Context&#xff08;环境类&#xff09;State&#xff08;抽象状态类&#xff09;Concret…...

API低代码平台介绍5-数据库记录修改功能

数据库记录修改功能 在上篇文章中我们介绍了如何插入数据库记录&#xff0c;本篇文章会沿用上篇文章的测试数据&#xff0c;介绍如何使用ADI平台定义一个修改目标数据库记录的接口&#xff0c;包括 单主键单表修改、复合主键单表修改、多表修改&#xff08;整合前两者&#xff…...

git commit撤销修改

背景 如果提交了代码&#xff0c;却发现有不需要提交的文件。这时候如何修改呢&#xff1f;可以用git reset指令。 git reset用法解释 git reset 命令用于回退版本&#xff0c;可以指定退回某一次提交的版本。 git reset 命令语法格式如下&#xff1a; git reset [--soft …...

深入理解RunLoop

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念&#xff0c;这篇文章将从 CFRunLoop 的源码入手&#xff0c;介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中&#xff0c;苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。 一…...

Elasticsearch term 查询:精确值搜索

一、引言 Elasticsearch 是一个功能强大的搜索引擎&#xff0c;它支持全文搜索、结构化搜索等多种搜索方式。在结构化搜索中&#xff0c;term 查询是一种常用的查询方式&#xff0c;用于在索引中查找与指定值完全匹配的文档。本文将详细介绍 term 查询的工作原理、使用场景以及…...

IntelliJ IDEA调试技巧

IntelliJ IDEA高级调试技巧 假设我们在UserService类的getUserAndCheckStatus方法中遇到了难以追踪的问题。以下是在IntelliJ IDEA中进行高效调试的一些进阶技巧&#xff1a; 1. 条件断点&#xff08;Conditional Breakpoint&#xff09; 如果你知道问题只在特定条件下出现&…...

NGINX_六 nginx 日志文件详解

六 nginx 日志文件详解 nginx 日志文件分为 **log_format** 和 **access_log** 两部分log_format 定义记录的格式&#xff0c;其语法格式为log_format 样式名称 样式详情配置文件中默认有log_format main $remote_addr - $remote_user [time_local] "req…...

第6章 工程项目融资 作业

第6章 工程项目融资 作业 一单选题&#xff08;共2题&#xff0c;40分&#xff09; (单选题) 项目资金结构不包括&#xff08; &#xff09;。 A.项目债务资金结构比例 B. 项目建设投资与工程项目总成本费用的比例 C. 项目资本金内部结构比例 D. 项目资本金与债务资金的比例 正…...

网站安全防护怎么做?

引言&#xff1a;在当今数字化的时代&#xff0c;网络安全已经成为个人、企业乃至整个社会的一项关键挑战。随着互联网的普及和信息技术的迅猛发展&#xff0c;我们的生活和工作方式日益依赖于各种互联网服务和数据交换。然而&#xff0c;这种依赖也带来了越来越多的安全威胁和…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...