第二章 线性表

本章的基本内容是:

A线性表的逻辑结构

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

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

D顺序表和链表的比较

E线性表的其他存储方法

线性表的定义

线性表:简称表,是nn≥0)个具有相同类型的数据元素的有限序列。
线性表的长度:线性表中数据元素的个数。
空表:长度等于零的线性表,记为:L=(  )
非空表记为:L=(a1, a2 , …, ai-1, ai , …, an)
其中,ai1≤i≤n)称为数据元素;
下角标i 表示该元素在线性表中的位置或序号。

线性表的特性

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

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

3. 顺序性:线性表中相邻的数据元素ai-1ai之间存在序偶关系(ai-1, ai),即ai-1ai的前驱,aiai-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(只存储数据元素),没有浪费空间;
链表:结点的存储密度<1(包括数据域和指针域),有指针的结构性开销。
结构的存储密度:
顺序表:需要预分配存储空间,如果预分配得过大,造成浪费,若估计得过小,又将发生上溢;
链表:不需要预分配空间,只要有内存空间可以分配,单链表中的元素个数就没有限制。

结论:

若线性表需频繁查找却很少进行插入和删除操作,或其操作和元素在表中的位置密切相关时,宜采用顺序表作为存储结构;若线性表需频繁插入和删除时,则宜采用链表做存储结构。
当线性表中元素个数变化较大或者未知时,最好使用链表实现;而如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。
总之,线性表的顺序实现和链表实现各有其优缺点,不能笼统地说哪种实现更好,只能根据实际问题的具体需要,并对各方面的优缺点加以综合平衡,才能最终选定比较适宜的实现方法。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值