数据结构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 //定义模板类SeqList

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