线性表
线性表的定义
线性表,或称表,是一种非常灵便的结构,可以根据需要改变表的长度,也可以在表中任何位置对元素进行访问、插入或删除等操作。另外,还可以将多个表连接成一个表,或把一个表拆分成多个表。例如,26个英文字母的字母表:(A,B,C,…,Z)就是一个线性表,表中的数据元素是单个字母。在稍复杂的线性表中,一个数据元素可以包含若干个数据项。例如在学生基本信息表中,每个学生为一个数据元素,包括学号、姓名、性别、籍贯、专业等数据项。
由以上示例可以看出,它们的数据元素虽然不同,但同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系
诸如此类由n(n≥0)个数据特性相同的元素构成的有限序列称为线性表。线性表中元素的个数 n(n≥0)定义为线性表的长度,n=0时称为空表
对于非空的线性表或线性结构,其特点是:
- 存在唯一的一个被称作第一个的数据元素
- 存在唯一的一个被称作最后一个的数据元素
- 除第一个数据元素之外,结构中的每个数据元素均只有一个前驱
- 除最后一个数据元素之外,结构中的每个数据元素均只有一个后继
线性表的顺序存储结构
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,用顺序存储结构的线性表称为顺序表。其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。
假设线性表的每个元素需占用x个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中第 i+1 个数据元素的存储位置LOC(ai+1)和第 i 个数据元素的存储位置LOC(ai)之间满足下列关系:
LoC(ai+1)=LOC(ai)+x
一般来说,线性表的第i个数据元素 ai的存储位置为:
LoC(ai)=LOC(ai)+(i-1)x
式中,LOC(a1)是线性表的第一个数据元素a1的存储地址位置,通常称作线性表的起始位置或基地址,表中相邻的元素ai和ai+1的存储位置是相邻的,每一个数据元素的存储位置都和线性表的起始位置相差一个常数,如图所示。
只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构
线性表的插入与删除运算
插入
线性表的插入操作是指在表的第 i(1 ≤ i ≤ n十1)个位置插人一个新的数据元素e,使长度为n的线性表变成长度为n+1的线性表
数据元素之间的逻辑关系发生了变化。在线性表的顺序存储结构中,由于逻辑上相邻的数据元素在物理位置上也是相邻的,因此,除非i=n+1,否则必须移动元素才能反映这个逻辑关系的变化。
如上图所示为一个线性表在插人新的数据元素前后数据元素在存储空间中的位置变化。为了在线性表的第5个位置上插人一个值为25的数据元素,则需将第5个至第8个数据元素依次向后移动一个位置。长度也发生变化,从原本n=8变成n=9。
一般情况下,在第i(1 ≤ i ≤ n)个位置插入一个元素时,需从最后一个元素即第n个元素开始,依次向后移动一个位置,直至第i个元素(共n-i+1个元素)。仅当插入位置i=n+1时,才无须移动数据元素
算法步骤:
- 判断插人位置i是否合法,若不合法则返回ERROR
- 判断顺序表的存储空间是否已满,若满则返回 ERROR
- 将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n十1时无须移动)
- 将要插入的新元素e放入第i个位置。
- 表长加 1。
顺序表插入算法的平均时间复杂度为O(n)。
删除
线性表的删除操作是指将表的第i ( 1 ≤ i ≤ n)个元素删去,将长度为n的线性表变成长度为n-1的线性表。数据元素之间的逻辑关系发生了变化,为了在存储结构上反映这个变化,同样需要移动元素。
如上图所示,为了删除第4个数据元素,必须将第5个至第8个元素都依次向前移动一个位置
算法步骤:
- 判断删除位置i是否合法,若不合法则返回ERROR。
- 将第i+1个至第n个的元素依次向前移动一个位置(i=n时无须移动)。
- 表长减 1。
由此可见,顺序表删除算法的平均时间复杂度为O(n)。