初识线性表和抽象数据类型
初识线性表和抽象数据类型
- 线性表
- 抽象数据类型
- 数据类型
- 抽象
- 抽象数据类型
- 抽象数据类型的标准格式
- 线性表的抽象数据类型定义
线性表 线性表是什么,简单来说线性表就如同生活中的排队一样,具有线一样性质的数据结构.线性表有0个(当数据元素为0时,称该线性表为空表)或者多个数据元素组成
- 线性表有以下几个特点
- 线性表是一个序列,即各数据元素之间有一定的前后关系
- 若线性表不为空表,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱或者后继
- 线性表中数据元素是有限的,因为无论计算计多强大,发展到多先进的程度,计算机能够处理的数据永远不可能是无限的
前驱和后继(数学语言描述)可以看出,区别于很多计算机高级语言,线性表的序列是从1开始的,也因此,我们将线性表的元素个数n定义为线性表的长度。
若将线性表记为a1.a2,…ai-1,ai,ai+1,…,an,则表中ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素
【初识线性表和抽象数据类型】
文章图片
上面这个图中可以看出总经理下分了别的职位,而总监下又分了别的职位,从线性表的特点:若线性表不为空表,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱或者后继,由于该图中一个数据元素有多个后继,所以我们可以判断该表不是线性表。
抽象数据类型 数据类型 数据类型[^1]指一组性质相同的值得集合以及定义在此集合上的一些操作的总称
- 在C语言中,数据类型按照取值的不同,可以分为
- 原子类型:不可再分解的基本类型,比如注1中的几种类型
- 结构类型:若干个类型组合而成,可以再分解的,比如整形数组(若干个整型数据组成)、结构体…
抽象 什么是抽象?抽象就是抽取出事物具有的普遍性的本质,它要求抽出问题的特征而忽略非本质的细节(对具体事务的一个概括),抽象是一种思考问题的方式,它隐藏了繁杂的细节。
比如,脏活累活交给男人来干,男人就是抽象,它不具体指是哪一个人。
抽象数据类型
对已有的数据类型进行抽象,就有了抽象数据类型(Abstract Data Type,ADT),指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅仅取决于它的一组逻辑特性,与其在计算机内部如何表示无关,例如1+1=2,在不同CPU的处理可能不一样,由于其数学特性相同,所以在计算机编程者眼中,它们相同。
“抽象”意义在于数学类型上的数学抽象特性。抽象数据类型不仅指已经定义并实现的数据类型,还可以是计算机变成这自己定义的数据类型,例如以后要学习的线性表。
抽象数据类型的标准格式
ADT(抽象数据类型名)
Data
数据元素之间逻辑关系的定义
Operation
操作
endADT
线性表的抽象数据类型定义
ADT线性表(List)
Data
线性表数据对象集合为{a~1~.a~2~,...a~i-1~,a~i~,a~i+1~,...,a~n~}
并且每个元素类型均为DataType,
除a~1~外,每个元素有且只有一个直接前驱元素,
除a~n~外,每个元素有且只有一个直接后继元素
元素之间关系:一一对应
Operation
InitList(*L);
//初始化,建立一个空的线性表L
ListEmpty(L);
//判断L是否为空表,为空,返回true,否则返回false
ClearList(*L);
//清空线性表L
GetElem(L,i,*e);
//将线性表L第i个元素返回给e
locateElem(L,e);
//在线性表L中查找查找与给定值e相等的元素,若查找成功,返回该元素在表中序号,表示成功,否则返回0表示失败
ListInsert(*L,i,e);
//在线性表L中第i个位置前插入新元素e
ListDelete(*L,i,*e);
//删除线性L表中第i个元素,并且用e返回其值
ListLength(L);
//返回线性表的元素个数
endADT
有了上面的定义,我们就可以方便的实现一些操作,例如下面的求两表并集(A=A∪B):
/*要实现两表并集,只需要遍历一表每一个元素,而后判断另一表是否有该元素,若有,忽略,没有插入*/
List *unionL(List *La,List Lb)
{
int lengtha=ListLength(*La);
//获得La的长度
int lengthb=Listlength(Lb);
//获得Lb的长度
ElemType *e;
//接收表Lb的值
/*表Lb为空表,直接返回表La*/
if(lengthb==0)
{
return La;
}
else
{
for(int i=1;
i<=lengthb;
i++)//遍历Lb
{
GetElem(Lb,i,*e);
//将Lb第i个元素赋值给e
if(!(locateElem(*La,e)))//判断La中是否有e,若没有在表a末尾插入e
{
ListInsert(*La,(lengtha+1)++,*e);
}
}
}
return La;
}
可见,定义了一个抽象数据类型,将其封装之后,我们将能够更方便快捷的解决一些实际问题
推荐阅读
- 急于表达——往往欲速则不达
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- leetcode|leetcode 92. 反转链表 II
- 下雪了,飞去你的城市拥抱你|下雪了,飞去你的城市拥抱你 | 有个直男向我表白了
- 2019女表什么牌子好(如何挑选女士手表?)
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 佳琪(三十一)
- 霍兰德职业代码对照表
- 戏曲表演对幼儿的好处。