数据结构之线性表的顺序存储结构

之前讲了集合的顺序存储结构和链式存储结构,今天接着聊下一个基本的数据结构--线性表,线性表是线性数据结构的一种表现形式

数据结构之集合的顺序存储结构

数据结构之集合的链式存储结构

线性表的定义

线性表是同一类型数据的一个有限序列,线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

线性表的顺序存储要求地址空间是连续的,地址必须一个接一个,不能中断。如下图为顺序存储结构:

顺序存储结构

线性表的顺序存储每个节点只包含数据部分,不需要额外包含数据之间的关系,因为数据之间的关系通过地址连续来体现,所以非常省空间

它的优点访问非常快速,因为地址是连续的,只要知道首地址,任意一个元素的地址都可以算出来。假设每个地址占c个空间,则第i个地址为(i-1)*c。

它的缺点是在插入和删除数据时,可能要移动许多数据,比如一个10000个元素的有序数据,如果我删除了第二个元素,为了继续保持地址连续,所以要把后面9999个元素都向前移动。

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

ADT Set is

  Data:

        采用任何一种存储方法存储的一个线性表

    Operation:

      initList() //初始化集合

      add(obj,pos)//向第pos个位置添加元素

      remove(pos)//删除第pos个位置的元素

      find(obj)//查找元素并返回其位置

      value(pos)//返回第pos个位置元素的值

      modify(obj,pos)//修改第pos个位置的元素为obj

      size()//获取线性表的长度

      isEmpty//判断线性表是否为空

      clear()//清空线性表

      forward()//正向遍历输出线性表中的所有值

      backward()//反向遍历输出线性表中的所有值

      sort()//根据当前线性表,返回一个排好序的线性表

线性表的顺序存储结构和操作实现

下面把线性表用java实现,首先定义一个线性表操作的接口,List

List接口

下面对线性表进行初始化

线性表的初始化

插入操作add,时间复杂度O(n)

插入元素操作

删除操作remove,时间复杂度O(n)

移除某个位置的元素

查找元素find,时间复杂度O(n)

查找元素

获取第i个位置元素,时间复杂度O(1)

获取第i个位置元素

修改某个位置元素modify,时间复杂度O(1)

修改元素

判空isEmpty,清空线性表clear和获取线性表元素长度size,时间复杂度O(1)

判空、清空、获取长度

正向遍历forward和反向遍历backward,时间复杂度O(n)

正反向遍历

根据当前线性表,返回一个排好序的线性表sort,时间复杂度O(n*n)

其中用了插入排序对线性表进行排序,如果插入排序忘记了的话,可以看看我这篇博文

必须掌握的八种排序(1-2)--插入排序,希尔排序

插入排序,返回排好序的线性表

测试及结果

测试及结果


好了,今天就到这里了,后面接着讲有序线性表的实现和线性表的链式存储结构