线性表 c语言 数据类型,初识线性表和抽象数据类型

初识线性表和抽象数据类型

线性表

抽象数据类型

数据类型

抽象

抽象数据类型

抽象数据类型的标准格式

线性表的抽象数据类型定义

线性表

线性表是什么,简单来说线性表就如同生活中的排队一样,具有线一样性质的数据结构.线性表有0个(当数据元素为0时,称该线性表为空表)或者多个数据元素组成

线性表有以下几个特点

线性表是一个序列,即各数据元素之间有一定的前后关系

若线性表不为空表,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱或者后继

线性表中数据元素是有限的,因为无论计算计多强大,发展到多先进的程度,计算机能够处理的数据永远不可能是无限的

前驱和后继(数学语言描述)

若将线性表记为a1.a2,…ai-1,ai,ai+1,…,an,则表中ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素

可以看出,区别于很多计算机高级语言,线性表的序列是从1开始的,也因此,我们将线性表的元素个数n定义为线性表的长度。

a6013402fa68a0fc91d28fb56796caa3.png

上面这个图中可以看出总经理下分了别的职位,而总监下又分了别的职位,从线性表的特点:若线性表不为空表,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱或者后继,由于该图中一个数据元素有多个后继,所以我们可以判断该表不是线性表。

抽象数据类型

数据类型

数据类型[^1]指一组性质相同的值得集合以及定义在此集合上的一些操作的总称

在C语言中,数据类型按照取值的不同,可以分为

原子类型:不可再分解的基本类型,比如注1中的几种类型

结构类型:若干个类型组合而成,可以再分解的,比如整形数组(若干个整型数据组成)、结构体…

[^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;

}

可见,定义了一个抽象数据类型,将其封装之后,我们将能够更方便快捷的解决一些实际问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值