首页 > 编程语言 >数据结构与算法(四)线性表的抽象数据类型描述

数据结构与算法(四)线性表的抽象数据类型描述

时间:2024-09-17 10:53:47浏览次数:13  
标签:LB 线性表 LA 元素 List 抽象数据类型 数据结构 LC

一、回顾

        上一篇我们讲到了线性表的定义,讲到了所谓抽象数据类型就是把数据类型和操作捆版在一起。那么我们接下来分析一下,线性表应该有什么样的相关操作呢?。

        从一个例子来看一看,回到我们上一篇开学参加升旗仪式的例子:

        老师把同学们按照规律排成一队,并且是长期使用这样的顺序排队,大家只需要记住自己前驱的同学就可以了。那么这种考虑和安排的过程其实就是一个线性表的创建和初始化过程。

        一开始老师没有经验,把同学们按照名字首字母的顺序排队,发现排列最后有的高有的矮,导致队伍很难看,于是让同学们解散从新按照从矮到高排队。上述过程其实就是线性表重置为空表的操作过程,接着我们描述一下删除数据。

        排好队之后,我们发现张三由于昨晚睡觉没盖被子,感冒发烧来不了了,那么张三原来的位置就被空出来了,由原来排在张三后面的同学开始往前挪。

        当然,有删除数据就会有插入数据,几天过后,张三同学康复回来上课了,他说他记得排在李四的后面,所以原本排在张三后面的同学就往后挪了一个位置,张三就插入回自己的位置上了。

        升旗后领导开始发言,领导发言的时候,下面的张三在说话搞小动作,年级主任找到班主任投诉,说:“你们班队伍里第八个同学在下面搞小动作,麻烦你去处理一下。”老师查了一下名单说,噢,他叫张三。这就是根据位序得到数据元素的例子。

二、线性表的抽象数据类型

        我们来总结一下线性表的抽象数据类型定义:

        1、ADT 线性表(List)

        2、Data:线性表的数据对象集合为{{a_1,a_2,a_3,...,a_n}},每个元素的类型均为DataType。其中,除第一个元素a_1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素a_n之外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

        而抽象数据类型就是把数据和操作捆绑在一起。

        3、Operation

        IniList(*L):初始化操作,建立一个空的线性表L。

        ListEmpty(L):判断线性表是否为空表,若线性表为空,返回true,否则返回false

        ClearList(*L):将线性表清空

        GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。

        LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。

        注意:我们在数组中,下标是从0开始的;但是在线性表中,回到了我们日常的用法,从1开始,所以0是没有东西的。

        ListInsert(*L,i,e):在线性表L中第i个位置插入新元素e。

        ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。

        ListLength(L):返回线性表L的元素个数。

三、复杂的线性表操作

        对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的,对于实际问题中设计的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。

        举个例子,假设有两个集合A和B(一个集合中没有相同值的元素),分别用两个线性表LA和LB表示,即线性表中的数据元素为集合中的元素,利用线性表的基本运算设计一个算法求一个新的集合C=A\cup{}B,即将两个集合的并集放在线性表LC中。

        先初始化线性表LC,即创建一个空的线性表LC,将LA的所有元素复制到LC中,然后遍历线性表LB,将LB中不属于LA的元素插入LC中。假设List是一个已经实现了的线性表数据结构,LA、LB和LC均为List类型变量。

        综合分析,我们需要运用到几个基本的操作组合即可:

        -ListLength(L);

        -GetElem(L,i,*e);

        -LocateElem(L,e);

        -ListInsert(*L,i,e);

        程序示例如下:

void unionList(List LA,List LB,list &LC)
{
    int lena,i;
    ElemType e;
    InitList(LC);//初始化LC
    for(i=1;i<=ListLength(LA);i++)//将LA中的所有元素复制到LC中
    {
        GetElem(LA,i,e);//取LA中的第i个元素赋给e
        ListInsert(LC,i,e);//将元素e插入LC中
    }
    lena = Listlength(LA);//求线性表LA的长度
    for(i=1;i<=ListLength(LB);i++)//循环处理LB中的每一个元素
    {
        GetElem(LB,i,e);//取LB中的第i个元素赋给e
        if(!LocateElem(LA,e))//判断e是否在LA中
            ListInsert(LC,++lena,e);//若不再LA中,则将其插入LC中
    }
}

        在上述算法中,LA和LB是输入型参数,而LC是求解结果,为输出型参数,所以将LC设计为引用型形参。

        从中可以看出,当线性表List实现以后,可以利用它作为存放集合数据的容器,也可以利用它的基本运算完成更复杂的集合运算,例如求两个集合的并集等。

          (本节完)

参考资料:

1、《数据结构教程》李春葆主编-清华大学出版社-2022.7

2、线性表2_哔哩哔哩_bilibili 鱼C小甲鱼

标签:LB,线性表,LA,元素,List,抽象数据类型,数据结构,LC
From: https://blog.csdn.net/less_duuuzx/article/details/142071012

相关文章

  • Java-数据结构-二叉树-习题(二) (´▽`)ノ
    文本目录:❄️一、习题一(分层遍历):   ▶ 思路:    ▶代码:❄️二、习题二(二叉树的最近公共祖先):    ▶ 思路: ▶代码: ❄️三、习题三(从前序和中序遍历序列中构造二叉树):     ▶ 思路:  ▶代码:❄️四、习题四(从中序和后序遍历序列中构造二......
  • C++数据结构-二叉树的三种遍历方法(进阶篇)
    1.遍历简介:树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序......
  • C++数据结构-二叉树的存储方法(基础篇)
    1.简介根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达......
  • 数据库索引分类以及底层数据结构
    数据库索引的分类和底层数据结构直接决定了它在不同场景下的性能和适用性。以下是数据库索引的主要分类及其底层数据结构的详细分析:一、数据库索引的分类1.主键索引(PrimaryKeyIndex)分类:唯一性索引的一种特殊形式。特点:对主键列创建的索引,保证唯一性且不能为空。底层结构:B......
  • 【数据结构和算法实践-树-LeetCode113-路径总和Ⅱ】
    数据结构和算法实践-树-LeetCode113-路径总和Ⅱ题目MyThought代码示例JAVA-8题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点输入:root=[5,4,8,11,null,13......
  • 数据结构之快速排序、堆排序概念与实现举例
    1、快速排序快速排序是一种高效的排序算法,采用分治法策略。它的基本思想是:通过一个划分操作,将待排序的数组分为两个(尽可能)均等的子数组,使得左侧子数组中的所有元素都不大于右侧子数组中的任何元素,然后对这两个子数组分别进行快速排序,整个排序过程可以递归进行,以此达到整个......
  • 数据结构之希尔排序
    1、希尔排序希尔排序是一种基于插入排序的算法,通过比较相距一定间隔的元素来工作,然后逐渐减少这个间隔,直到它变为1,此时算法退化为简单插入排序,但此时,大部分元素已经是基本有序的,所以最后的插入排序效率很高。2、希尔排序说明与举例希尔排序是一种基于插入排序的高效排序......
  • redis基本数据结构-set
    文章目录1.set的基本介绍1.1.set底层结构之hash表的简单介绍1.2.常用命令2.常见的业务场景2.1.标签系统2.2.社交网络好友关系1.set的基本介绍参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72Aredis的set数据结构是一个无序的集合,可以存储不......
  • 【算法】【线性表】【数组】买卖股票的最佳时机
    1 题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你......
  • 【算法】【线性表】【数组】买卖股票的最佳时机 II
    1 题目给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在同一天 出售。返回 你能获得的最大利润 。示例1:输入:prices=[7,1,5,3,......