【数据结构与算法】线性表

news2024/10/10 15:05:28

文章目录

  • 一.什么是线性表?
  • 二.线性表如何存储?
  • 三.线性表的类型

我们知道从应用中抽象出共性的逻辑结构和基本操作就是抽象数据类型,然后实现其存储结构和基本操作。下面我们依然按这个思路来认识线性表

一.什么是线性表?

  1. 定义

    线性表(Linear List)是由n(n>=0)个具有相同特性的数据元素(结点)a1,a2,…an组成的有限序列。如下图所示:

  • 线性起点也称首元
  • 如果这个线性表没有元素,即n=0时为空表
  • 统一线性表中的元素必定具有相同的特性,数据元素间的关系是线性关系。

线性表的例子

【例1】分析26个英文字母组成的英文标:(A,B,C,D,……,Z)

数据元素都是字母;元素间关系是线性。

【例2】分析学生情况登记表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
数据元素都是记录;元素间关系是线性

【例3】十二星座(白羊座,金牛座,双子座,……,双鱼座)

数据元素都是字符串;元素间关系是线性

  1. 特点
    • 在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2
    • 有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋a(n-1)
    • 其余的内部结点ai(2<=i<=n-1)都有且仅有一个直接前趋a(i-1)和一个直接后继a(i+1).
    • 线性表是一种典型的线性结构。

二.线性表如何存储?

即线性表在计算机里如何实现这个运算?

我们从一个案例来引出线性表的两种存储方式:

【案例2.1】一元多项式的运算(实现两个多项式加减乘运算)

我们可以把每个系数拿出来存成一个线性表,用数组来实现,变量用系数的下标隐含的表示:

这样我们可以顺利的进行两个一元多项式的加运算:

【案例2.2】多项式非零项的数组表示

很多项缺失,就不能用下标来隐含的表示指数了:

继续用顺序存储法来进行多项式的加法运算:

  1. 创建一个新数组C(这就意味着需要一个新的空间)
  2. 分别从头遍历比较a和b的每一项
    • 指数相同,对应系数相加,若其和不为零,则在c中增加一个新项
    • 指数不同,则将指数较小的项复制到c中
  3. 一个多项式已遍历完毕时,将另一个剩余项依次复制到c中即可。

结果如下:

01717
711225

稀疏多项式有很多项缺失,这样存储的话会造成存储空间很大的浪费,怎么办?

我们发现顺序存储结构存在的问题:

  • 存储空间分配不灵活
  • 运算的空间复杂度高

下面用**链式存储法(指针)**进行上面案例的实现:

分别把系数不为0的项的系数和指数存储起来,这个线性表中的每个元素都有两个数据项,再存储下一个元素的位置,如下图所示:

我们再引入一个实际案例来理解链式结构存储:

【案例2.3】图书管理系统

在该图书管理系统中我们需要的功能有:查找,插入,删除,修改,排序和计数。

  1. 首先,将图书表抽象为线性表,表中每本图书抽象为线性表中数据元素

  2. 选择合适的存储结构

    • 图书顺序表

    • 图书链表

  3. 实现此存储结构上的基本操作

  4. 利用基本操作完成功能

三.线性表的类型

1.前面已经给出了抽象数据类型的定义,抽象数据类型线性表的定义如下:

ADT List{
    数据对象:D={ai|ai属于Elemset,(i=1,2,...n,n>=0)}
    数据关系:R={<ai-1,ai>|ai-1,ai属于D,(i=2,3,...n)}
    基本操作:
}ADT List

2.基本操作

  • InitList(&L)(Initialization List)
    • 操作结果:构造一个空的线性表L.(线性表的初始化)
  • DestroyList(&L)
    • 初始条件:线性表L已经存在
    • 操作结果:销毁线性表L
  • ClearList(&L)
    • 作用:线性表内容的清除
    • 初始条件:线性表L已经存在
    • 操作结果:将线性表L重置为空表
  • ListEmpty(L)
    • 作用:判断线性表里是否有元素
    • 初始条件:线性表L已经存在。
    • 操作结果:若线性表L为空表,则返回TURE;否则返回FALSE
  • ListLength(L)
    • 初始条件:线性表L已经存在
    • 操作结果:返回线性表L中的数据元素个数
  • **GetElem(L,i,&e)**替换
    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)
    • 操作结果:用e返回线性表L中第i个数据元素的值
  • **LocateElem(L,e,compare())**定位查找
    • 初始条件:线性表L已经存在,compare()是数据元素判定函数
    • 操作结果:返回L中第一个与e满足compare()的数据元素的位序。若这样的数据元素不存在则返回值为0.
  • **PriorElem(L,cur_e,&pre_e)**求前驱
    • 初始条件:线性表L已经存在
    • 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败;pre_e无意义。
  • **NextElem(L,cur_e,&next_e)**求后驱
    • 初始条件:线性表L已经存在
    • 操作结果:若cur_e是L的数据元素,且不是第最后个,则用next_e返回
  • **ListInsert(&L,i,e)**插入
    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)+1
    • 操作结果:在L的第i个位置之前插入新的数据元素e,L的长度加一
  • **ListDelete(&L,i,&e)**删除
    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)+1
    • 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减一。
  • ListTraverse(&L,visited())
    • 初始条件:线性表L已经存在
    • 操作结果:依次对线性表中每个元素调用visited()

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

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

相关文章

【项目记录】大模型基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 本文在qemu-riscv64平台上&#xff0c;利用向量扩展指令加速运行基于llama.cpp构建的大模型。 参考博客链接&#xff1a; Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Banana Pi F3 RISCV开发板上的演示 llama.cpp工程 Llama.cpp是一个基…

C语言-指针变量,常量与数组名的细微区别辨析

本节根据两个选择题进行展开辨析 一、例1 本题答案&#xff1a;C 解析&#xff1a;强干扰选项是B&#xff0c;我相信大多数同学都会在B&#xff0c;C之间犹豫好久&#xff0c;那么为什么答案会最终选择C呢&#xff1f;因为本题在定义函数&#xff0c;所以a首先是一个数组名&a…

【学习笔记】一种使用多项式快速计算 sin 和 cos 近似值的方法

一种使用多项式快速计算 sin 和 cos 近似值的方法 在嵌入式开发、游戏开发或其他需要快速数学计算的领域&#xff0c;sin 和 cos 函数的计算时间可能会影响程序的整体性能。特别是在对时间敏感、精度要求不高的场景中&#xff0c;传统的 sin 和 cos 函数由于依赖复杂的数值方法…

SOMEIP_ETS_168: SD_TestFieldUINT8Reliable

测试目的&#xff1a; 验证DUT能够通过Getter和Setter方法正确地发送和接收TestFieldUINT8Reliable字段的值&#xff0c;并且这些操作是可靠的。 描述 本测试用例旨在确保DUT的ETS能够响应Tester的请求&#xff0c;正确地使用Getter方法获取TestFieldUINT8Reliable的值&…

【MySQL必知会】事务

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 事务概念 &#x1f4c1; 事务操作 &#x1f4c1; 事务提交方式 &#x1f4c1; 隔离级别 &#x1f4c1; MVCC &#x1f4c2; 3个隐藏列字段 &#x1f4c2; undo日志 &#x1f4c2; Read View视图 &#x1f4c1; RR和R…

分治算法(5)_归并排序_排序数组

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(5)_归并排序_排序数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

JavaSE——面向对象11:内部类(局部内部类、匿名内部类、成员内部类、静态内部类)

目录 一、内部类基本介绍 (一)内部类定义 (二)内部类基本语法 (三)内部类代码示例 (四)内部类的分类 二、局部内部类 三、匿名内部类(重要) (一)基本介绍 (二)基于接口的匿名内部类 (三)基于类的匿名内部类 (四)注意事项与使用细节 (五)匿名内部类的最佳实践——当…

leetcode-42. 接雨水 单调栈

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

Chrome浏览器调用ActiveX控件--allWebOffice控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;本…

vim编辑器安装,并修改配置使其默认显示行数

centOS默认是未安装vim编辑器的&#xff0c;而vim编辑器相比vi编辑器更易用一些&#xff0c;如需使用vim编辑器&#xff0c;需要进行安装。 1.需要先配置本地yum源&#xff0c;参见如下链接&#xff1a; 点击查看如何配置本地yum源 2.安装vim编辑器&#xff0c;并修改配置。…

滑动窗口_找出字符串中所有字母异位词、串联所有单词的子串_C++

滑动窗口_找出字符串中所有字母异位词、串联所有单词的子串_C 1. 题目解析2. 算法分析3. 代码实现4. 举一反三&#xff1a;串联所有单词的子串 1. 题目解析 leetcode链接&#xff1a;https://leetcode.cn/problems/VabMRr/ 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p …

helm 测试安装redis

helm search repo redis # 搜索redis的chart helm show readme bitnami/redis # 展示安装相关文档&#xff08;readme文件&#xff09; 拉取指定版本的安装包&#xff08;chart&#xff09; helm pull bitnami/redis --version 17.4.3 解压安装包 tar -xf redis-17.4.3.tgz …

Vue3 动态路由实现的一种方法

动态路由 目的&#xff1a; 根据服务器传回来的数据动态的注册路由信息&#xff0c;登录用户的角色不同生成的菜单不同 使用插件做动态路由的好处&#xff1a; 路由页面增加或者减少时&#xff0c;只需要增加或减少相关的路由文件&#xff0c;不需要再修改代码 服务器返回的信…

POI数据的处理与分析

POI概念 POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据指的是地理空间数据中的一类&#xff0c;表示某一具体地点或位置的信息。通常&#xff0c;这些数据包含位置坐标&#xff08;经纬度&#xff09;、名称、地址、类别和其他相关信息。POI 数据广泛应…

毕业设计 深度学习水果识别

文章目录 1 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果 1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果…

算法剖析:双指针

文章目录 双指针算法一、 移动零1. 题目2. 算法思想3. 代码实现 二、 复写零1. 题目2. 算法思想3. 代码实现 三、 快乐数1. 题目2. 算法思想3. 代码实现 四、 盛水最多的容器1. 题目2. 算法思想3. 代码实现 五、有效三角形的个数1. 题目2. 算法思想3. 代码实现 六、 和为 s 的两…

【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。EXCEL使用表格。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000020 案例 保姆级教程&#xff0c;附多个操作案例。…

【强训笔记】day27

NO.1 代码实现&#xff1a; #include<iostream>using namespace std;int n,m; int main() {cin>>n>>m;long long retn;for(int i0;i<m-1;i)retret*(n-1)%109;cout<<ret<<endl;return 0; }NO.2 思路&#xff1a;bfs遍历实现&#xff0c;dis…

Android架构--MVVM

一、开发架构 是什么&#xff1f; 二、Android开发中的架构 具体到Android开发中&#xff0c;开发架构就是描述 视图层、逻辑层、数据层 三者之间的关系和实施&#xff1a; 视图层&#xff1a;用户界面&#xff0c;即界面的展示、以及交互事件的响应。 逻辑层&#xff1a;为…

IL2CPP和Mono的区别

Mono 是一种开源的跨平台 .NET 框架实现&#xff0c;能够执行 C# 代码。Unity 使用 Mono 来处理 C# 脚本&#xff0c;并通过 JIT&#xff08;Just-In-Time&#xff09;即时编译器将托管代码转换为本地机器代码&#xff0c;随后在目标平台上执行 IL2CPP 代表 Intermediate Lang…