数据结构ch02
- 格式:doc
- 大小:1.41 MB
- 文档页数:15
第 2 章 线性表
1
第 2 章 线 性 表
2.1 线性表的逻辑结构
2.1.1 线性表的定义
线性表简称表,是零个或多个具有相同类型的数据元素的有限序列。数据元素的个数定义为线性表的长度。长度等于零时称为空表,一个非空表通常记为:L=(a1,a2,„„,an)。
2.1.2 线性表的抽象数据类型定义
线性表的抽象数据类型定义为:
ADT List
Data
线性表中的数据元素具有相同类型,相邻元素具有前驱和后继关系
Operation
InitList
前置条件:线性表不存在
输入:无
功能:线性表的初始化
输出: 无
后置条件:一个空的线性表
DestroyList
前置条件:线性表已存在
输入:无
功能:销毁线性表
输出:无
后置条件:释放线性表所占用的存储空间
Length
前置条件:线性表已存在
输入:无
功能:求线性表的长度
输出: 线性表中数据元素的个数
后置条件:线性表不变
Get
前置条件:线性表已存在
输入:元素的序号i
功能:在线性表中取序号为i的数据元素
输出:若序号合法,返回序号为i的元素值,否则抛出异常
后置条件:线性表不变
Locate
前置条件:线性表已存在
输入:数据元素x
功能:在线性表中查找值等于x的元素
输出:若查找成功,返回元素x在表中的序号,否则返回0 相同类型的含义:
序列的含义:
线性表的示意图:
将线性表抽象数据类型定义为抽象类: 2 数据结构电子笔记
后置条件:线性表不变
Insert
前置条件:线性表已存在
输入:插入位置i;待插元素x
功能:在线性表的第i个位置处插入一个新元素x
输出:若插入不成功,抛出异常
后置条件:若插入成功,表中增加了一个新元素
Delete
前置条件:线性表已存在
输入:删除位置i
功能:删除线性表中的第i个元素
输出:若删除成功,返回被删元素,否则抛出异常
后置条件:若删除成功,表中减少了一个元素
Empty
前置条件:线性表已存在
输入:无
功能:判断线性表是否为空表
输出:若是空表,返回1,否则返回0
后置条件:线性表不变
PrintList
前置条件:线性表已存在
输入:无
功能:按位置的先后次序依次输出线性表中的元素
输出:线性表的各个数据元素
后置条件:线性表不变
endADT
2.2 线性表的顺序存储结构及实现
2.2.1 线性表的顺序存储结构——顺序表
线性表的顺序存储结构称为顺序表。
2.2.1 顺序表的实现
将线性表的抽象数据类型定义在顺序表存储结构下用C++的类实现。
const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义 说明:
1.顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。
2.通常用一维数组来实现顺序表,C++中数组的下标从1开始。
3.线性表中第i个元素存储在数组(C++)中下标为i-1的位置。
4.顺序表的存储示意图:
5.设顺序表的每个元素占用c个存储单元,则第i个元素的存储地址为:
LOC(ai)= LOC(a1)+(i-1)×c 第 2 章 线性表
3
template
class SeqList
{
public:
private:
};
1.构造函数
顺序表类提供了两个构造函数。
无参构造函数SeqList( ):创建一个空的顺序表,即将顺序表的长度初始化为0;
有参构造函数SeqList(T a[ ], int n):创建一个长度为n的顺序表,其操作过程如图2-3所示。
下面给出具体的构造函数。
2. 插入
10 12 15 25 8 16 20
10 12 15 25 8 16 20 空 闲 7 数组a
顺序表
图2-3 有参构造函数操作示意图 线性表的长度为7
插入15
(b) 插入后
图2-4 将元素15插入位置3顺序表前后状态的对比 a1 10 a2 12 a3 25 a4 8 a5 16 a6 20 空 闲 6 插入前线性表的长度为6
a1
10 a2
12 a3
15 a4
25 a5
8 a6
16 a7
20 空 闲 7 插入后线性表的长度为7 数组下标: 0 1 2 3 4 5 MaxSize-1
(a) 插入前 template
SeqList:: SeqList(T a[ ], int n)
{
} 顺序表有参构造函数SeqList 4 数据结构电子笔记
算法用伪代码描述如下:
具体的顺序表插入算法。
3.删除
(b) 删除后
图2-5 将位置3处的元素删除时顺序表前后状态的对比 删除a3 a1 10 a2 12 a3 25 a4 8 a5 16 a6 20 空 闲 7 数组下标: 0 1 2 3 4 5 6 MaxSize-1 删除前线性表的长度为7
(a) 删除前 a7 45
a1 10 a2 12 a3 8 a4 16 a5 20 空 闲 6 a6 45 删除后线性表的长度为6 几点说明:
1.插入后,元素ai-1和ai之间的逻辑关系发生了变化并且存储位置要反映这个变化。
2.插入时,若在表尾插入,直接插入即可,否则元素必须是从最后一个元素开始移动,直至将第i个元素后移为止,然后将新元素插入位置i处。(注意元素移动方向)
3.考虑插入时的边界条件:如果表满了,则引发上溢异常;如果元素的插入位置不合理,则引发位置异常。
时间性能分析:
·最好情况:
·最坏情况:
·一般情况:
※ 结论: template
void SeqList::Insert(int i, T x)
{
} 顺序表插入算法Insert 第 2 章 线性表
5
算法用伪代码描述如下:
顺序表删除算法。
4. 查找
⑴ 按位查找
几点说明:
1.删除后元素ai-1和ai+1之间的逻辑关系发生了变化并且存储位置要反映这个变化。
2.删除时,若在表尾删除,直接删除即可,否则元素必须是从第i+1个元素(下标为i)开始移动,直至将最后一个元素前移为止。(注意元素移动方向)
3.在移动元素之前要取出被删元素。
4.考虑删除时的边界条件:如果表空,则引发下溢异常;如果元素的删除位置不合理,则引发位置异常。
时间性能分析
·最好情况:
·最坏情况:
·平均情况:
※ 结论: template
T SeqList::Delete(int i)
{
} 顺序表删除算法Delete