数据结构 - 线性表-上 (二)
定义:
零个或者多个数据元素的有限序列
基本概念
前驱和后继
数据结构中,一组数据中的每个个体被称为“数据元素”(简称“元素”)。
对于具有“一对一”逻辑关系的数据,线性表中有准确的术语:
- 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
- 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;
以图 1 数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如图 4 所示:
图 1 前驱和后继
基本特征
- 集合中必存在唯一的一个“第一元素”。
- 集合中必存在唯一的一个 “最后元素” 。
- 除最后一个元素之外,均有唯一的后继(后件)。
- 除第一个元素之外,均有唯一的前驱(前件)。
线性表-顺序存储结构
线性表的顺序存储结构,指的是用一段连续的存储单元依次存储线性表的数据元素。
线性表的顺序存储结构主要是通过自定义结构体来实现
顺序顺序存储结构需要三个属性:
- 存储空间的起始位置:数组名data
- 线性表的最大存储容量:MAXSIZE
- 线性表的当前长度:length
主要的操作有:
- 查询
- 插入
- 删除
下面给出定义
// 定义数据类型
type ElemType int
//设置表的最大存储空间
const MAXSIZE = 30
//表的结构定义
type SqList struct {
data [MAXSIZE]ElemType
length int
}
主要操作之查询
对于顺序存储结构,查询操作极为简单,此算法的时间复杂度位O(1),只需传入相应位置参数i即可``func ``(``p ``*``SqList``) ``GetElemte``(``i ``int``) (``res ``ElemType``, ``err ``error``)
算法略
主要操作之插入
插入操作的时间复杂度为O(n)func ``(``p ``*``SqList``) ``Insert``(``i ``int``, ``e ``*``ElemType``) ``error ``{
思路如下:
- 如果插入位置不合理,抛出异常
- 如果线性表长度大于数组长度,则抛出异常或者增加容量
- 从最后一个元素开始,向前遍历到第i个位置,将它们都向后移动一个位置
- 将要插入的元素填入位置i处
- 将表长加1
主要操作之删除
删除操作涉及到移动元素,时间复杂度为O(n)func ``(``p ``*``SqList``) ``DelElemte``(``i ``int``) ``error
思路如下:
- 判断删除位置是否正确,错误则抛出异常
- 删除元素的直接后继开始,向后遍历,每个元素依次向前移动一位
- 删除最后一个元素
- 将表长减1
优缺点
优点:
- 无需为表示表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速的存取表中任一位置的元素
缺点:
- 插入和删除操作需要移动大量的元素
- 当线性表长度变化较大时候,难以提前确定存储空间的大小,而动态分配空间又会消耗大量计算资源
- 造成存储空间的碎片