您的位置:首页 > 其它

第二章 线性表

2014-10-31 11:17 99 查看

本章的基本内容是:

A线性表的逻辑结构

B线性表的顺序存储及实现

C线性表的链接存储及实现

D顺序表和链表的比较

E线性表的其他存储方法

线性表的定义

p 线性表:简称表,是n(n≥0)个具有相同类型的数据元素的有限序列。

p 线性表的长度:线性表中数据元素的个数。

p 空表:长度等于零的线性表,记为:L=(  )。

p 非空表记为:L=(a1,
a2 , …, ai-1, ai , …, an)

其中,ai(1≤i≤n)称为数据元素;

下角标i
表示该元素在线性表中的位置或序号。

线性表的特性

1.
有限性:线性表中数据元素的个数是有穷的。

2.
相同性:线性表中数据元素的类型是同一的。

3.
顺序性:线性表中相邻的数据元素ai-1和ai之间存在序偶关系(ai-1,
ai),即ai-1是ai的前驱,ai是ai-1的后继;a1无前驱,an无后继,其它每个元素有且仅有一个前驱和一个后继。

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

ADT List

Data      

      线性表中的数据元素具有相同类型,

     
相邻元素具有前驱和后继关系

Operation

InitList

   
前置条件:表不存在

   
输入:无

   
功能:表的初始化

   
输出:无

   
后置条件:建一个空表

DestroyList    

   
前置条件:表已存在

   
输入:无

   
功能:销毁表

   
输出:无

   
后置条件:释放表所占用的存储空间

Length

   
前置条件:表已存在

    
输入:无

    
功能:求表的长度

    
输出:表中数据元素的个数                                             

    
后置条件:表不变

Get

   
前置条件:表已存在

   
输入:元素的序号i

   
功能:在表中取序号为i的数据元素

   
输出:若i合法,返回序号为i的元素值,否则抛出异常

   
后置条件:表不变

Locate

   
前置条件:表已存在

   
输入:数据元素x

   
功能:在线性表中查找值等于x的元素

   
输出:若查找成功,返回x在表中的序号,否则返回0

   
后置条件:表不变

Insert

前置条件:表已存在

输入:插入i;待插x

功能:在表的第i个位置处插入一个新元素x

输出:若插入不成功,抛出异常

   
后置条件:若插入成功,表中增加一个新元素

Delete

前置条件:表已存在

输入:删除位置i

功能:删除表中的第i个元素

   
输出:若删除成功,返回被删元素,否则抛出异常

   
后置条件:若删除成功,表中减少一个元素

Empty

   
前置条件:表已存在

   
输入:无

   
功能:判断表是否为空

   
输出:若是空表,返回1,否则返回0

   
后置条件:表不变

ADT

进一步说明:

(1)线性表的基本操作根据实际应用是而定;

(2)复杂的操作可以通过基本操作的组合来实现;

(3)对不同的应用,操作的接口可能不同。

顺序表——线性表的顺序存储结构   

存储要点:

用一段地址连续的存储单元

 

依次存储线性表中的数据元素

顺序表的实现——插入

顺序表的实现——插入

算法描述——伪代码

1.
如果表满了,则抛出上溢异常;

2.
如果元素的插入位置不合理,则抛出位置异常;

3.
将最后一个元素至第i个元素分别向后移动一个位置;

4.
将元素x填入位置i处;

5.
表长加1;

顺序表的优缺点

Ø 顺序表的优点:

⑴无需为表示表中元素之间的逻辑关系而增加额外的存储空间;

⑵随机存取:可以快速地存取表中任一位置的元素。

Ø 顺序表的缺点:

⑴插入和删除操作需要移动大量元素;

⑵表的容量难以确定,表的容量难以扩充;

⑶造成存储空间的碎片。

单链表

单链表:线性表的链接存储结构。

存储思想:用一组任意的存储单元存放线性表的元素。

存储特点:

1.逻辑次序和物理次序

   
不一定相同。

2.元素之间的逻辑关系

   
用指针表示。

单链表的实现———插入

算法描述——伪代码

 1.
工作指针p初始化;            

 2.
查找第i-1个结点并使工作指针p指向该结点;

 3.
若查找不成功,则插入位置不合理,抛出插入位置异常;

    
否则,

     3.1
生成一个元素值为x的新结点s;

     3.2
将新结点s插入到结点p之后;

单链表的实现———删除

算法描述——伪代码

 1.工作指针p初始化;

 2.
查找第i-1个结点并使工作指针p指向该结点;

 3.
若p不存在或p不存在后继结点,则抛出位置异常;

    
否则,

         3.1
暂存被删结点和被删元素值;

         3.2
摘链,将结点p的后继结点从链表上摘下;

         3.3
释放被删结点;

         3.4
返回被删元素值;

启示:算法设计的一般过程

算法设计的一般步骤:

第一步:确定入口(已知条件)、出口(结果);

第二步:根据一个小实例画出示意图;

第三步:①正向思维:选定一个思考问题的起点,逐步提出问题、解决问题;②逆向思维:从结论出发分析为达到这个结论应该先有什么;③正逆结合;

第四步:写出顶层较抽象算法,分析边界情况;

第五步:验证第四步的算法;

第六步:写出具体算法;

第七步:进一步验证,手工运行。

双链表

双链表:在单链表的每个结点中再设置一个指向其前驱结点的指针域。

结点结构:

data:数据域,存储数据元素;

prior:指针域,存储该结点的前趋结点地址;

next:指针域,存储该结点的后继结点地址。

存储分配方式比较

A顺序表采用顺序存储结构,即用一段地址连续的存储单元依次存储线性表的数据元素,数据元素之间的逻辑关系通过存储位置来实现。

B链表采用链接存储结构,即用一组任意的存储单元存放线性表的元素,用指针来反映数据元素之间的逻辑关系。

时间性能比较

时间性能是指实现基于某种存储结构的基本操作(即算法)的时间复杂度。

按位查找:

A顺序表的时间为O(1),是随机存取;

B链表的时间为O(n),是顺序存取。

插入和删除:

A顺序表需移动表长一半的元素,时间为O(n);

B链表不需要移动元素,在给出某个合适位置的指针后,插入和删除操作所需的时间仅为O(1)。

空间性能比较

空间性能是指某种存储结构所占用的存储空间的大小。

定义结点的存储密度:

存储密度=数据域占用的存储量/整个结点占用的存储量

结点的存储密度:

A顺序表:结点的存储密度为1(只存储数据元素),没有浪费空间;

B 链表:结点的存储密度<1(包括数据域和指针域),有指针的结构性开销。

结构的存储密度:

A 顺序表:需要预分配存储空间,如果预分配得过大,造成浪费,若估计得过小,又将发生上溢;

B 链表:不需要预分配空间,只要有内存空间可以分配,单链表中的元素个数就没有限制。

结论:

⑴若线性表需频繁查找却很少进行插入和删除操作,或其操作和元素在表中的位置密切相关时,宜采用顺序表作为存储结构;若线性表需频繁插入和删除时,则宜采用链表做存储结构。

⑵当线性表中元素个数变化较大或者未知时,最好使用链表实现;而如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。

总之,线性表的顺序实现和链表实现各有其优缺点,不能笼统地说哪种实现更好,只能根据实际问题的具体需要,并对各方面的优缺点加以综合平衡,才能最终选定比较适宜的实现方法。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: