Java常用算法手册(第3版)
上QQ阅读APP看书,第一时间看更新

2.2 线性表

从这一节开始介绍各种常用的数据结构。首先要看的便是线性表。线性表是一种典型的线性结构,是最简单、最常用的数据结构。

2.2.1 什么是线性表

谈到线性表(Linear List),首先应该分析其逻辑定义。从逻辑上来看,线性表就是由n(n≥0)个数据元素a1,a2,…,an组成的有限序列。这里需要说明如下几点:

・数据元素的个数为n,也称为表的长度,当n=0的时候称为空表;

・如果一个线性表非空,即n>0,则可以简单地记作(a1,a2,…,an);

・数据元素ai(1≤i≤n)表示了各个元素,在不同的场合,其含义也不同。

在现实生活中,可以找到很多线性表的例子。比如英文字母表就是最简单的线性表,英文字母表(A,B,C,…,Z)中,每个英文字符就是一个数据元素,也称为数据结点。另外,表2-1某班级学生成绩表也是一个线性表。在这里,数据元素就是某个学生的记录,其中包括学号、姓名、各个科目的成绩等。

对于一个非空的线性表,其逻辑结构特征如下:

・有且仅有一个开始结点a1,没有直接前趋结点,有且仅有一个直接后继结点a2

・有且仅有一个终结结点an,没有直接后继结点,有且仅有一个直接前趋结点an-1

・其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋结点ai-1和一个直接后继结点ai+1

・对于同一线性表,各数据元素ai必须具有相同的数据类型,即同一线性表中各数据元素具有相同的类型,每个数据元素的长度相同。

2.2.2 线性表的基本运算

前面介绍的是线性表的逻辑结构,再来分析线性表的基本运算。线性表的基本运算包括如下内容。

1)初始化

初始化表(InitList)即构造一个空的线性表L。

2)计算表长

计算表长(ListLength)即计算线性表L中结点的个数。

3)获取结点

获取结点(GetNode)即取出线性表L中第i个结点的数据,这里1≤i≤ListLength(L)。

4)查找结点

查找结点(LocateNode)即在线性表L中查找值为x的结点,并返回该结点在线性表L中的位置。如果在线性表中没有找到值为x的结点,则返回一个错误标志。这里需要注意的是,线性表中有可能含有多个与x值相同的结点,那么此时就返回第一次查找到的结点。

5)插入结点

插入结点(InsertList)即在线性表L的第i个位置插入一个新的结点,使得其后的结点编号依次加1。这时,插入一个新结点之后,线性表L的长度将变为n+1。

6)删除结点

删除结点(DeleteList)即删除线性表L中的第i个结点,使得其后的所有结点编号依次减1。删除一个结点之后,线性表L的长度将变为n-1。

上述内容是一个线性表最基本的运算,当然读者根据需要还可以定义其他一些运算。

至此,线性表的逻辑结构和数据运算讨论完毕,线性表的存储结构还没有介绍。其实,在计算机中线性表可以采用两种方法来保存,一种是顺序存储结构,另一种是链式存储结构。顺序存储结构的线性表称为顺序表,而链式存储结构的线性表称为链表。顺序表和链表就是下面要介绍的内容。