线性表与顺序存储结构(上)

前言

线性表:零个或多个数据元素的有限序列。

线性表是数据结构中最常用和最简单的一种结构。

本文介绍的是线性表和线性表的顺序存储结构的部分内容。

正文

什么是线性表?

顾名思义,是具有像线一样的性质的表。

首先,它是一个序列,元素之间是有顺序的。如果有多个元素,第一个元素无前驱,最后一个元素也无后继,其他的每一个元素则都有且只有一个前驱和后继。元素的前一个元素是直接前驱元素,后一个是直接后继元素

其次,线性表是有限的,也就是元素个数是有限的。(事实上计算机处理的对象都是有限的,无限的数列只存在于数学概念中。)

线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,成为空表

在非空表中的每个数据元素都有一个确定的位置。假如a是第i个数据元素,就说i是a在线性表中的位序

线性表的抽象数据类型

前面我们已经知道了线性表的定义,那么线性表应该有一些什么样的操作呢?

线性表的创建和和初始化、线性表重置为空表、根据位序得到数据元素、查找某个元素是否存在,获得线性表长度、插入数据和删除数据,这些都是最基本的线性表操作。

而对于实际问题中涉及的关于线性表的更复杂的操作,完全可以用这些基本操作的组合来实现

举个例子,如果想实现两个线性表集合A和B的并集操作。也就是说要让A=AUB,其实就是把存在集合B中但不存在于A中的数据元素插入到集合A中即可。

分析

我们可以循环集合B中的每个元素,判断当前元素是否存在于集合A中,若不存在就把它插入集合A中。

代码参考

首先假设我们有这些方法:

ListLength(L)      返回线性表L的元素个数
GetElem(L,i,*e)    将线性表L中的第i个位置的元素值返回给e
LocateElem(L,e)    在线性表L中查找与e相等的元素,如果查找成功返回钙元素的序号;否则返回0
ListInsert(*L,i,e) 在线性表L中的第i个位置插入新元素e

然后假设La表示集合A,Lb表示集合B:

//将线性表Lb中存在而La中不存在的数据插入到La中
void unionL(SqList* La, SqList Lb)
{int La_len, Lb__len, i;ElemType e;//线性表La和Lb中元素的数据类型为ElemTypeLa_len = ListLength(*La);Lb_len = ListLength(Lb);for (i = 1; i <= Lb_len; i++)//遍历集合B{GetElem(Lb, i, &e);//取Lb中第i个数据元素赋给eif (!LocateElem(*La, e))//如果La中不存在和e相同的数据元素{ListInsert(La, ++La_len, e);//不存在就插入数据}}
}

可以看到,在实现给La加入Lb中La没有的元素的函数unionL中,我们用到了更为基本的操作ListLength,GetElem,LocateElem,ListInsert等。所以说复杂的线性表操作是基本操作的组合。

注意:

给函数传递参数时,如果这个参数在函数内不会被改动,可以直接传递这个参数(值传递);

如果这个参数在函数内需要被改动,就需要传递指向这个参数的指针。

上面的La需要改动,Lb无需改动,所以形参一个是SqList *La,一个则是SqList Lb。

线性表的顺序存储结构
顺序存储定义

顺序表的两种物理结构的其中一种——顺序存储结构:

线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素。

顺序存储方式

通俗来说,线性表的顺序存储结构就是在内存中找了一块空间然后把相同数据类型的数据元素依次存放在这块空间中。由于线性表的每个数据元素的类型都相同,所以可以用一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表相邻的元素存储在数组相邻的位置。

这块空间的第一个位置很重要,这是存储空间的起始位置;我们需要估算这个线性表的最大存储容量,数组的最大长度就是最大存储容量;内存单元里可能有空的,随着数据插入线性表的当前长度变大,但当前长度不能超过存储容量即数组的长度。这是一些要注意的点。

线性表的顺序存储的结构代码:

#define MAXSIZE 20//存储空间初始分配量
typedef int ElemType;//ElemType即线性表数据类型,为了方便修改类型(比如int改char),这样写
typedef struct
{ElemType data[MAXSIZE];//数组,存储数据元素类型为intint length;//线性表当前长度
}SqList;//给结构体重命名为SqList

可以总结出描述顺序存储结构需要的三个属性:

1.存储空间的起始位置         即data

2.线性表的最大存储容量     数组长度MAXSIZE

3.线性表的当前长度            length

数组长度与线性表长度的区别

这两个概念是需要区别开来的。数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。虽然高级语言如C、VB、C++都可以用编程手段实现动态分配数组,不过这会带来性能上的损耗。

线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作,长度是可变的

在任何时候,线性表的长度应该小于等于数组的长度。

地址计算方法

数组的下标是从0开始的,于是线性表的第i个元素存储在数组下标为i-1的位置,数据元素的序号和存放它的数组下标之间存在对应关系。

我们知道每个存储单元的编号就是地址。假设每个数据元素占用c个存储单元,线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足:

第i个数据元素的地址+c == 第i+1个数据元素的地址。

假设第1个数据元素的地址为m,则m+(i-1)*c就为第i个数据元素的地址。

通过这个公式,我们可以算出线性表中任意位置的地址。

本文到此结束,祝阅读愉快^_^

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

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

相关文章

刷代码随想录有感(120):贪心算法——买卖股票的最佳时机

题干&#xff1a; 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int res INT_MIN;for(int i 0; i < prices.size(); i){low min(low, prices[i]);res max(res, prices[i] - low);}return res;} }; 贪心…

周末总结(2024/06/29)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内 工作上的要点 现状&#xff08;接受破烂现状&#xff0c;改变…

ARCGIS添加在线地图

地图服务地址&#xff1a;http://map.geoq.cn/ArcGIS/rest/services 具体方法&#xff1a; 结果展示&#xff1a;

T4打卡 学习笔记

所用环境 ● 语言环境&#xff1a;Python3.11 ● 编译器&#xff1a;jupyter notebook ● 深度学习框架&#xff1a;TensorFlow2.16.1 ● 显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 2070 设置GPU from tensorflow import keras from tensorflow.keras…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的字符串拼接游戏(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Spring Boot中的分布式文件系统

Spring Boot中的分布式文件系统 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Spring Boot中实现分布式文件系统的搭建和应用…

GO sync包——读写锁

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

单例模式在 Android中的应用

单例模式在Android开发中的应用非常广泛&#xff0c;它确保了一个类在应用中只有一个实例&#xff0c;并提供了一个全局访问点。以下是对单例模式在Android中应用的深入讲解&#xff1a; 一、应用场景 全局资源管理&#xff1a; 在Android应用中&#xff0c;经常需要管理全局…

多表查询实训

前提 本篇博客&#xff0c;我将通过讲解例题的方式&#xff0c;带大家进一步掌握多表查询的使用规则和使用技巧 正文 前提 先建好表 表1 salgrade (薪资等级表&#xff09; 表2 emp(员工信息表&#xff09; 表3 dept&#xff08;部门信息表&#xff09;&#xff0c;插入相…

拉普拉斯变换(Laplace Transform)

拉普拉斯变换概述 拉普拉斯变换&#xff08;Laplace Transform&#xff09;是一种积分变换&#xff0c;用于将时间域&#xff08;通常是连续时间&#xff09;的信号转换到复频域&#xff0c;以便简化对系统的分析和设计。它在控制系统、信号处理、电路分析等领域广泛应用。 拉…

docker-mysql主从复制

MySQL主从复制 安装docker和拉取镜像不再赘述 一.主服务器 1.新建主服务器容器-3307 &#xff08;这里设置的密码可能不生效&#xff0c;若未生效请看问题中的2&#xff09; docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \…

老年生活照护实训室:探索现代养老服务的奥秘

在老龄化社会加速发展的今天&#xff0c;如何为老年人提供优质、贴心的生活照护服务&#xff0c;成为了社会关注的焦点。老年生活照护实训室作为培养专业养老服务人才的重要场所&#xff0c;正逐渐揭开现代养老服务的神秘面纱&#xff0c;为我们展现出一幅充满关爱与智慧的画卷…

第三十七篇——麦克斯韦的妖:为什么要保持系统的开放性?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 如果没有详细的学习这篇文章&#xff0c;我觉得我就是被麦克斯韦妖摆弄的…

[机缘参悟-200] - 对自然、人性、人生、人心、人际、企业、社会、宇宙全面系统的感悟 - 全图解

对自然、人性、人生、人心、人际、企业、社会、宇宙进行全面系统的感悟&#xff0c;是一个极其深邃且复杂的主题。以下是对这些领域的简要感悟&#xff1a; 自然&#xff1a; 自然是人类生存的根基&#xff0c;它充满了无尽的奥秘和美丽。自然界的平衡和循环规律&#xff0c;教…

JDBC的使用(一)

一、JDBC 概述 1.1 持久化概述 持久化(persistence): 把内存中的数据保存到可掉电式存储设备 (硬盘、U盘等) 中以供之后使用。 大多数企业级应用&#xff0c;数据持久化是将数据保存到各种关系数据库&#xff0c; 而在 Java中&#xff0c;数据库存取技术只能通过 JDBC 来访问数…

41.HOOK引擎设计原理

上一个内容&#xff1a;41.HOOK引擎设计原理 在一个游戏里通过hook来完成各种各样的功能&#xff0c;比如hook点是a、b、c&#xff0c;然后a点会有它自己所需要的hook逻辑&#xff0c;b、c也是有它们自己的hook逻辑&#xff08;hook逻辑指的是hook之后要做的事&#xff09;&am…

算法设计与分析--近似算法内容整理

文章目录 P、NP、NP-hard 和 NPC多项式时间概念区分NP-hard 的证明例题 1 证明 T S P TSP TSP 问题是 N P − h a r d NP-hard NP−hard 问题 。例题 2 证明最大加权独立集问题是 N P − h a r d NP-hard NP−hard 问题。 扩展 NP-hard 问题3-SAT 问题TSP 旅行商问题 Load B…

c#网络Tcp和udp

TCP 通信 TCP 服务端 Socket tcpServer new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress new IPAddress(new byte[] { 192, 168, 1, 5 }); IPEndPoint ipEndPoint new IPEndPoint(ipAddress, 7788); tcpServer.Bind(ip…

AI大模型的制造业场景,一文读懂

导读 如何认识这一轮AI技术发展影响的深度和广度&#xff1f;如何判断这一轮AI技术变革的性质&#xff1f; AI大模型是通用人工智能发展的重要里程碑。中央会议关于人工智能发展提出三个第一次&#xff1a;第一次提出“通用人工智能”&#xff0c;第一次提出“产业智能化”&a…

武汉星起航:激发中国卖家潜力,亚马逊减免政策共筑电商辉煌

在全球化电子商务的浪潮中&#xff0c;亚马逊作为全球领先的电商平台&#xff0c;一直致力于为卖家提供卓越的服务和支持。特别是对于中国卖家而言&#xff0c;亚马逊的减免优惠政策无疑是一股强大的助力&#xff0c;帮助他们在不断发展的市场中脱颖而出&#xff0c;实现业务的…