感受线性表的存在

从今天开始带大家开始学习第一个数据结构:线性表

先让我我们通过图片来感受一下,线性表的特性吧。

大家姑且可以把这幅图想象为老师组织同学们外出野营。因为学生队伍强大,要老师记住每位学生并区分还真不是一件容易的事。

所以咱想到了一个办法,让大家按照一个约定排成一队,以后大家要怎么记住自己的位置呢?没错,大家只需要记住自己前边的学生即可。

老师也可以很快的清点人数,万一有人走丢,也能在最快时间内知道是谁不见了,因为只需要问哪位学生的“前驱”不见啦即可。

线性表的定义

线性表,从刚才的描述中我们可以很容易感受到是像排队一样,具有线一样性质的结构。

线性表(List):由零个或多个数据元素组成的有限序列。

这里需要强调几个关键的地方:

首先它是一个序列,也就是说元素之间是有个先来后到的,像刚才的小蝌蚪就没有顺序。

若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。

另外,线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。

如果用数学语言来进行定义,可如下:

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

所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

考题模拟

请问公司的组织架构是否属于线性关系?

分析:一般公司的总经理管理几个总监,每个总监管理几个经理,每个经理都有各自的下属和员工。

那这样的组织架构是不是线性关系呢?

当然不是啦!注意线性关系的条件是如果存在多个元素,则“第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。”

那么班级里同学之间的友谊呢?

当然也不是,因为每个人都会跟许多同学建立纯纯的友谊关系。

好,再来一题,那如果是情侣间的爱情关系呢?

哈,还是扯淡,这要是线性关系还哪里容得下第三者?!

最后一个问题,一个班级里的点名册,是不是线性表?

嗯,这个就是了。

学号

姓名

性别

职位

1

张三

班长

2

李四

副班长

3

王舞

音乐课代表

4

张柳

学生

5

赵六

小组长

抽象数据类型

那在介绍抽象数据类型之前,我们应该了解数据类型的定义是什么?

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

例如很多编程语言的整型,浮点型,字符型这些指的就是数据类型。

当年那些设计计算机语言的人,为什么会考虑到数据类型呢?

比如,大家都需要住房子,也都希望房子越大越好。但显然,没有多少钱的话考虑房子是没啥意义的。

于是商品房就出现了各种各样的房型,有别墅的,有错层的,有单间的,甚至在北京还出现了胶囊公寓——只有两平方米的房间。

这样子就满足了大家的不同需求。

同样,在计算机中,内存也不是无限大的,你要计算入1+1=2这样的整型数字的加减乘除运算,显然不需要开辟很大的内存空间。

而如果要计算1.23456789+2.987654321这样带大量小数的,就需要开辟比较大的空间才存放的下。

于是计算机的研究者们就考虑,要对数据类型进行分类,分出多种数据类型来适合各种不同的计算条件差异。

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

原子类型:不可以再分解的基本类型,例如整型、浮点型、字符型等。

结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干整型数据组成的。

抽象:是指抽取出事物具有的普遍性的本质。它要求抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节。

我们对已有的数据类型进行抽象,就有了抽象数据类型。

抽象数据类型(Abstract Data Type,ADT)是指一个数学模型及定义在该模型上的一组操作。

抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

比如1+1=2这样一个操作,在不同CPU的处理上可能不一样,但由于其定义的数学特性相同,所以在计算机编程者看来,它们都是相同的。

“抽象”的意义在于数据类型的数学抽象特性。

而且,抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。

例如一个3D游戏中,要定位角色的位置,那么总会出现x,y,z三个整型数据组合在一起的坐标。我们就可以定义一个point的抽象数据类型,它拥有x,y,z三个整型变量,这样我们就可以方便的对一个角色的位置进行操作。

为了便于在之后的讲解中对抽象数据类型进行规范的描述,我们给出了描述抽象数据类型的标准格式:

ADT 抽象数据类型名
Data数据元素之间逻辑关系的定义
Operation操作
endADT

线性表的抽象数据类型

上节课我们讲到了线性表的定义,讲到了所谓抽象数据类型就是把数据类型和相关操作捆绑在一起。

那么我们接下来分析一下,线性表应该有什么样的相关操作呢?

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

一开始老师没经验呀,把同学们按照名字第一个字母的规律排队,发现排到最后有的高有的矮,导致队伍很难看,于是让同学们解散重新按照从矮到高排。

上边这么描述的过程其实就是线性表重置为空表的操作过程,接着给大家描述下删除数据。

排好队后,尼玛,发现小明童鞋由于昨晚吃太多麻辣烫,今天闹肚子来不了春游。那么由原来排在小明后边的小花开始往前挪。

当然有删除数据就有插入数据,小明童鞋下午肚子康复了,又回来了。小明童鞋说记得是排在小阳后边的,所以让从小阳后边的小花开始往后退一个位置,小明就可以插回自己的位置上了。

噢,我们活动开始了不久,隔壁来了春田花花旅游团都是美眉啊,各种调戏有木有?然后老师被她们的导游投诉了有木有?!导游说你们队伍里第八个那个家伙老是调戏我们队里的小舞,他叫什么名字?老师查了下名单说,噢,他叫胖虎。

好吧,这就是根据位序得到数据元素的例子。

好了,剩下的还有很多大家可以自己想象。

我们给大家总结下线性表的抽象数据类型定义:

ADT 线性表(List)

Data

线性表的数据对象集合为{a1,a2,…,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

Operation

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

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

ClearList(*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): 返回线性表L的元素个数。

endADT

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

举个例子?好吧,比如要实现两个线性表A、B的并集操作,即要使得集合A=A∪B。

解释下“A=A∪B”:说白了,就是把存在集合B中但不存在集合A中的元素插入到A中即可。

其实仔细思考一下,我们只需要循环遍历集合B中的每个元素,判断当前元素是否存在A中,弱不存在,则插入A中即可。

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

ListLength(L);

GetElem(L,i,*e);

LocateElem(L,e);

ListInsert(*L,i,e);

参考实现代码段:

// La表示A集合,Lb表示B集合。
void unionL(List *La, list Lb)
{int La_len, Lb_len, i;ElemType e;La_len = ListLength(*La);Lb_len = ListLength(Lb);for( i=1; i <= Lb_len; i++ ){GetElem(Lb, i, &e);if( !LocateElem(*La, e) ){ListInsert(La, ++La_len, e);}}
}

可下载观看 数据结构与算法动画演示,以帮助我们更好的理解和学习代码的实现过程。

数据结构与算法(003):线性表-概述相关推荐

  1. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  2. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  3. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  4. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

  5. 数据结构和算法基础--线性表

    数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...

  6. Java数据结构与算法_线性表_顺序表与链表

    文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...

  7. Java数据结构和算法:线性表

    线性表的定义 线性表(linear-list)是最常用最简单的一种数据结构.一个线性表是n (n≥0)个相同类型数据元素的有限序列.记为: L= (a1, a2 , - , an ). 其中,L是表名 ...

  8. 学习笔记-数据结构与算法之线性表

    目录 框架图 线性表 顺序结构 创建线性表 输出验证 获取第i个元素 插入元素到特定位置 删除特定位置元素 整体代码 链式结构 创建链表 输出验证 获取第i个元素 插入元素 删除元素 删除整表 完整代 ...

  9. 数据结构与算法之线性表(超详细顺序表、链表)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...

  10. 《数据结构与算法》——线性表顺序存储结构的插入与删除

    什么是线性表? 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之间的关系是一对 ...

最新文章

  1. 电脑人会得哪些病----------关注健康,关爱生命!
  2. 跨域策略文件crossdomain.xml文件
  3. dtsi与dts_[dts]DTS实例分析
  4. 文献记录(part29)--Building crack identification and total quality management method based on deep ...
  5. chdir、getcwd、mkdir、rmdir函数
  6. Jeecg Maven本地仓库下载地址
  7. python复利计算函数_PyThon编程入门:了解python format格式化函数的使用
  8. openmvide使用需要什么插件_什么伺服电机需要加装减速机才能使用?
  9. winform 中导入excel时提示“未在本地计算机上注册“microsoft.ACE.oledb.12.0”
  10. linux 系统tty、pty和pts 的概念及区别
  11. 计算机组成原理实验(logisim)
  12. win7 做无盘服务器配置,两种方法轻松实现无盘安装Win7系统
  13. mate7 android升级包下载,华为mate7 刷机包
  14. UE4 实现C++蓝图接口
  15. div 空隙的解决办法
  16. O2O商业模式目前的状态需看透什么?未来会呈现怎样的特征?
  17. html实现文件的下载
  18. perl linux yum,Linux CentOS6.5(x86_64)安装Perl5.26
  19. Excel的F4键妙用,赶紧来学一下吧
  20. unity物体边缘发光shader_Shaderlab Notizen 15 Rim Shader(边缘发光)的两种实现形态

热门文章

  1. mapstruct java: Ambiguous mapping methods found for mapping collection element
  2. []int16转[]byte
  3. JAVA二级计算机干货整理(一)基本操作题
  4. 计算机技术在生物教学中应用,信息技术在生物教学中的应用
  5. CTF Web方向考点总结
  6. IMX6DL 在Android4.4.2版本插入SD卡不能开机
  7. json mysql 字段 默认值_MySQL新增JSON类型字段的使用总结
  8. OpenCL编程初探
  9. arping命令使用方法
  10. 几种Linux备份方法