首页 > 编程语言 >【数据结构与算法】线性表

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

时间:2024-10-08 22:18:44浏览次数:8  
标签:存储 线性表 元素 初始条件 算法 基本操作 数据结构 数据

文章目录


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

一.什么是线性表?

  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()

标签:存储,线性表,元素,初始条件,算法,基本操作,数据结构,数据
From: https://blog.csdn.net/2301_79279099/article/details/142747278

相关文章

  • 基于稀疏CoSaMP算法的大规模MIMO信道估计matlab性能仿真,对比LS,OMP,MOMP,CoSaMP
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):     2.算法涉及理论知识概要      大规模MIMO技术通过增加天线数量来显著提升无线通信系统的性能。然而,随着天线数量的增长,信道状态信息(CSI)的准确获取变得越来越具有挑战性。传统的信道估计方法......
  • 【图论】迪杰特斯拉算法
    文章目录迪杰特斯拉算法主要特点基本思想算法步骤示例实现迪杰斯特拉算法基本步骤算法思路总结迪杰特斯拉算法迪杰特斯拉算法是由荷兰计算机科学家艾兹赫尔·迪杰特斯拉(EdsgerW.Dijkstra)在1956年提出的,用于解决单源最短路径问题的经典算法。该算法的目标是从一......
  • 【机器学习】线性回归算法简介 及 数学实现方法
    线性回归简介利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。数学公式:ℎ_(w)=w_1x_1+w_2x_2+w_3x_3+…+b=w^Tx+b概念​利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进......
  • 代码随想录算法训练营day9|●151.翻转字符串里的单词 ●卡码网:55.右旋转字符串 ●28.
    学习资料:https://programmercarl.com/0151.翻转字符串里的单词.html学习记录:151.翻转字符串里的单词(感觉C语言能考虑巧妙解法,而python直接搞就对了)c语言:把字符串整体反转,再用双指针法(slow,fast)依次翻转每一个单词,关键在于如何移除多余空格,用slow指针找到要替换到的位置,用fast......
  • 代码随想录算法训练营 | 62.不同路径,63. 不同路径 II
    62.不同路径题目链接:62.不同路径文档讲解︰代码随想录(programmercarl.com)视频讲解︰不同路径日期:2024-10-08想法:第一行第一列只有一种方法,除此之外的各自的方法数由其左和上的格子的和得到。Java代码如下:classSolution{publicintuniquePaths(intm,intn){......
  • 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真
    1.程序功能描述基于MUSIC算法的六阵元圆阵DOA估计matlab仿真.2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%MUSIC谱矩阵Pmusic=zeros(90/steps+1,360/steps);fortheta=0:steps:90forphi=0:steps:360-steps%计算时......
  • 探索优化的艺术:深入理解模拟退火算法
    探索优化的艺术:深入理解模拟退火算法在解决复杂优化问题的过程中,选择合适的算法至关重要。模拟退火算法(SimulatedAnnealing,SA)作为一种基于概率的启发式搜索方法,因其在处理大规模和复杂优化问题时表现出的卓越能力,近年来受到了广泛关注。本文将带您深入了解模拟退火算法的原理、......
  • 基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印)  2.算法运行软件版本MATLAB2022A 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)figureplot(Error2,'linewidth',2);gridonxlabel('迭代次数');ylabel('遗传算法优化过程');legend('Averagefitness'......
  • 算法学习--3 (快速排序)
    引言快速排序(QuickSort)是计算机科学中最流行的排序算法之一,它基于“分治”思想,通过递归地将数组分成两部分并分别排序,从而实现排序的目的。与冒泡排序和选择排序等简单算法相比,快速排序在平均情况下的性能非常优越,因此广泛应用于实际场景。本文将详细介绍快速排序的工作原理......
  • 算法学习--4 (插入排序)
    引言插入排序(InsertionSort)是一种简单且直观的排序算法,常用于小规模数据的排序。它的工作原理与人类排序扑克牌的方式类似,每次将一个元素插入到已经排好序的部分,直到所有元素都插入完成。本文将介绍插入排序的原理、实现代码、时间复杂度分析以及优缺点。插入排序的基本原......