线性表:零个或多个数据元素的有限序列。
举个例子:小学生排队,有一个打头,一个收尾。当中的每一个知道他前面一个是谁,后面一个是谁。
关于线性表,这里强调几个地方,帮助大家理解线性表。
第一,他是一个序列,也就是说,元素之间是有顺序的。若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。
如果排队的小朋友前面有两个小朋友,那就不可以排成一队了。同样,如果一个小朋友后面有两个小朋友,也是不合理的。
第二,线性表强调是有限的。
就像小朋友班级人数是有限的。实际上在计算机中处理的对象都是有限的,哪种无限的序列,一般只存在于数学概念中。
如果用数学语言来进行定义:
若将线性表记为(a1,...,ai-1,ai,ai+1,...,an ),则其中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接后继元素。当i=1,2,...,n-1时,ai有且仅有一个直接后继。当i=2,3,...,n时,ai有且仅有一个直接前驱。所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。非空表的第i个元素为ai,i称为数据元素ai在线性表中的位序。
在较为复杂的线性表中,一个数据元素可以由若干个数据项组成。
线性表的抽象模型
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的元素个数。
对于不同应用,线性表的基本操作时不同的,上述操作是最基本的。对于实际问题中涉及的更复杂的操作,完全可以用这些基本操作的组合来实现。在实际编程中,还应该熟悉编程语言关于线性表的常用API,以简化编程,使得编写的程序更易于理解。
对于java程序员来说,线性表是十分重要的,对应该语言的集合部分。弄懂了线性表相关知识,对于java的集合的理解有着不小的帮助。同样的,如果本身比较熟悉,能深入理解集合底层部分知识,学习这部分也是事半功倍的。加油!
当前只是介绍了线性表的一些基本概念与术语。后面几篇,我会分别介绍一下线性表的顺序存储结构与链式存储结构,以及单链表,静态链表等知识。大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!
路漫漫其修远兮,吾将上下而求索。。。