




已阅读5页,还剩95页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章线性表 线性表的逻辑结构线性表的顺序存储及实现线性表的链接存储及实现顺序表和链表的比较线性表的其他存储方法 本章的基本内容是 2 1线性表的逻辑结构 数据元素之间的关系是什么 2 1线性表的逻辑结构 数据元素之间的关系是什么 现实生活中 许多问题抽象出的数据模型是线性表 如何存储这种线性结构并实现插入 删除 查找等基本操作呢 线性表 简称表 是n n 0 个具有相同类型的数据元素的有限序列 线性表的长度 线性表中数据元素的个数 空表 长度等于零的线性表 记为 L 非空表记为 L a1 a2 ai 1 ai an 2 1线性表的逻辑结构 线性表的定义 其中 ai 1 i n 称为数据元素 下角标i表示该元素在线性表中的位置或序号 2 1线性表的逻辑结构 线性表的特性 1 有限性 线性表中数据元素的个数是有穷的 2 相同性 线性表中数据元素的类型是同一的 3 顺序性 线性表中相邻的数据元素ai 1和ai之间存在序偶关系 ai 1 ai 即ai 1是ai的前驱 ai是ai 1的后继 a1无前驱 an无后继 其它每个元素有且仅有一个前驱和一个后继 线性表的抽象数据类型定义 ADTListData线性表中的数据元素具有相同类型 相邻元素具有前驱和后继关系OperationInitList前置条件 表不存在输入 无功能 表的初始化输出 无后置条件 建一个空表 2 1线性表的逻辑结构 DestroyList前置条件 表已存在输入 无功能 销毁表输出 无后置条件 释放表所占用的存储空间Length前置条件 表已存在输入 无功能 求表的长度输出 表中数据元素的个数后置条件 表不变 2 1线性表的逻辑结构 线性表的抽象数据类型定义 Get前置条件 表已存在输入 元素的序号i功能 在表中取序号为i的数据元素输出 若i合法 返回序号为i的元素值 否则抛出异常后置条件 表不变Locate前置条件 表已存在输入 数据元素x功能 在线性表中查找值等于x的元素输出 若查找成功 返回x在表中的序号 否则返回0后置条件 表不变 2 1线性表的逻辑结构 线性表的抽象数据类型定义 Insert前置条件 表已存在输入 插入i 待插x功能 在表的第i个位置处插入一个新元素x输出 若插入不成功 抛出异常后置条件 若插入成功 表中增加一个新元素Delete前置条件 表已存在输入 删除位置i功能 删除表中的第i个元素输出 若删除成功 返回被删元素 否则抛出异常后置条件 若删除成功 表中减少一个元素 2 1线性表的逻辑结构 线性表的抽象数据类型定义 Empty前置条件 表已存在输入 无功能 判断表是否为空输出 若是空表 返回1 否则返回0后置条件 表不变ADT 进一步说明 1 线性表的基本操作根据实际应用是而定 2 复杂的操作可以通过基本操作的组合来实现 3 对不同的应用 操作的接口可能不同 2 1线性表的逻辑结构 线性表的抽象数据类型定义 2 2线性表的顺序存储结构及实现 顺序表 线性表的顺序存储结构 例 34 23 67 43 34 23 67 43 4 2 2线性表的顺序存储结构及实现 顺序表 线性表的顺序存储结构 例 34 23 67 43 34 23 67 43 4 用什么属性来描述顺序表 2 2线性表的顺序存储结构及实现 顺序表 线性表的顺序存储结构 例 34 23 67 43 34 23 67 43 4 如何实现顺序表的内存分配 0 i 2i 1 n 1Max 1 a1 ai 1 ai an 空闲 长度 2 2线性表的顺序存储结构及实现 顺序表 一般情况下 a1 a2 ai 1 ai an 的顺序存储 数组的长度Max 线性表的长度Length 数组的长度大于等于当前线性表的长度 如何求得任意元素的存储地址 0 i 2i 1 n 1Max 1 a1 ai 1 ai an 空闲 长度 2 2线性表的顺序存储结构及实现 顺序表 一般情况下 a1 a2 ai 1 ai an 的顺序存储 0 i 2i 1 n 1Max 1 a1 ai 1 ai an 空闲 长度 Loc ai Loc a1 i 1 c 随机存取 在O 1 时间内存取数据元素 2 2线性表的顺序存储结构及实现 顺序表 一般情况下 a1 a2 ai 1 ai an 的顺序存储 2 2线性表的顺序存储结构及实现 存储结构是数据及其逻辑结构在计算机中的表示 存取结构是在一个数据结构上对查找操作的时间性能的一种描述 存储结构和存取结构 顺序表是一种随机存取的存储结构 的含义为 在顺序表这种存储结构上进行的查找操作 其时间性能为O 1 顺序表类的声明 constintMaxSize 100 template 模板类classSeqList public SeqList 构造函数SeqList DataTypea intn SeqList 析构函数intLength DataTypeGet inti intLocate DataTypex voidInsert inti DataTypex DataTypeDelete inti private DataTypedata MaxSize intlength 2 2线性表的顺序存储结构及实现 操作接口 SeqList 算法描述 SeqList SeqList length 0 2 2线性表的顺序存储结构及实现 顺序表的实现 无参构造函数 0 操作接口 SeqList DataTypea intn 顺序表的实现 有参构造函数 2 2线性表的顺序存储结构及实现 5 35 12 24 33 42 templateSeqList SeqList DataTypea intn if n MaxSize throw 参数非法 for i 0 i n i data i a i length n 2 2线性表的顺序存储结构及实现 顺序表的实现 有参构造函数 算法描述 操作接口 voidInsert inti DataTypex 插入前 a1 ai 1 ai an 插入后 a1 ai 1 x ai an 顺序表的实现 插入 2 2线性表的顺序存储结构及实现 ai 1和ai之间的逻辑关系发生了变化 顺序存储要求存储位置反映逻辑关系 存储位置要反映这个变化 例 35 12 24 42 在i 2的位置上插入33 表满 length MaxSize合理的插入位置 1 i length 1 i指的是元素的序号 2 2线性表的顺序存储结构及实现 顺序表的实现 插入 4 35 12 24 42 a1 a2 a3 a4 01234 42 24 12 33 什么时候不能插入 1 如果表满了 则抛出上溢异常 2 如果元素的插入位置不合理 则抛出位置异常 3 将最后一个元素至第i个元素分别向后移动一个位置 4 将元素x填入位置i处 5 表长加1 算法描述 伪代码 2 2线性表的顺序存储结构及实现 顺序表的实现 插入 templatevoidSeqList Insert inti DataTypex if length MaxSize throw 上溢 if ilength 1 throw 位置 for j length j i j data j data j 1 data i 1 x length 算法描述 C 描述 2 2线性表的顺序存储结构及实现 顺序表的实现 插入 基本语句 最好情况 i n 1 基本语句执行0次 时间复杂度为O 1 最坏情况 i 1 基本语句执行n 1次 时间复杂度为O n 平均情况 1 i n 1 时间复杂度为O n 时间性能分析 2 2线性表的顺序存储结构及实现 顺序表的实现 插入 操作接口 DataTypeDelete inti 删除前 a1 ai 1 ai ai 1 an 删除后 a1 ai 1 ai 1 an 顺序表的实现 删除 2 2线性表的顺序存储结构及实现 ai 1和ai之间的逻辑关系发生了变化 顺序存储要求存储位置反映逻辑关系 存储位置要反映这个变化 例 35 33 12 24 42 删除i 2的数据元素 仿照顺序表的插入操作 完成 1 分析边界条件 2 分别给出伪代码和C 描述的算法 3 分析时间复杂度 2 2线性表的顺序存储结构及实现 顺序表的实现 删除 5 35 a1 a2 a3 a4 01234 42 24 12 33 a5 12 24 42 顺序表的实现 按位查找 操作接口 DataTypeGet inti 2 2线性表的顺序存储结构及实现 0 i 2i 1 n 1Max 1 a1 ai 1 ai an 空闲 n 算法描述 templateDataTypeSeqList Get inti if i 1 时间复杂度 顺序表的实现 按值查找 操作接口 intLocate DataTypex 2 2线性表的顺序存储结构及实现 5 35 a1 a2 a3 a4 01234 42 24 12 33 a5 例 在 35 33 12 24 42 中查找值为12的元素 返回在表中的序号 templateintSeqList Locate DataTypex for i 0 i length i if data i x returni 1 return0 2 2线性表的顺序存储结构及实现 顺序表的实现 按值查找 算法描述 时间复杂度 顺序表的优缺点 顺序表的优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间 随机存取 可以快速地存取表中任一位置的元素 顺序表的缺点 插入和删除操作需要移动大量元素 表的容量难以确定 表的容量难以扩充 造成存储空间的碎片 2 2线性表的顺序存储结构及实现 单链表 线性表的链接存储结构 存储思想 用一组任意的存储单元存放线性表的元素 2 3线性表的链接存储结构及实现 单链表 存储特点 逻辑次序和物理次序不一定相同 2 元素之间的逻辑关系用指针表示 2 3线性表的链接存储结构及实现 例 a1 a2 a3 a4 的存储示意图 单链表 a10200 a20325 a30300 a4 2 3线性表的链接存储结构及实现 单链表 数据域 指针域 单链表是由若干结点构成的 单链表的结点只有一个指针域 data 存储数据元素next 存储指向后继结点的地址 templatestructNode DataTypedata Node next 2 3线性表的链接存储结构及实现 单链表 如何申请一个结点 s newNode templatestructNode DataTypedata Node next 2 3线性表的链接存储结构及实现 单链表 s newNode 2 3线性表的链接存储结构及实现 单链表 如何引用数据元素 data 如何引用指针域 next s next 2 3线性表的链接存储结构及实现 单链表 重点在数据元素之间的逻辑关系的表示 所以 将实际存储地址抽象 什么是存储结构 2 3线性表的链接存储结构及实现 单链表 头指针 指向第一个结点的地址 尾标志 终端结点的指针域为空 2 3线性表的链接存储结构及实现 单链表 空表和非空表不统一 缺点 如何将空表与非空表统一 头结点 在单链表的第以一个元素结点之前附设一个类型相同的结点 以便空表和非空表处理统一 2 3线性表的链接存储结构及实现 单链表 非空表 templateclassLinkList public LinkList LinkList DataTypea intn LinkList intLength DataTypeGet inti intLocate DataTypex voidInsert inti DataTypex DataTypeDelete inti voidPrintList private Node first 单链表类的声明 2 3线性表的链接存储结构及实现 单链表的实现 遍历操作 操作接口 voidPrintList 核心操作 关键操作 工作指针后移 从头结点 或开始结点 出发 通过工作指针的反复后移而将整个单链表 审视 一遍的方法称为扫描 或遍历 2 3线性表的链接存储结构及实现 first a1 a2 an ai 单链表的实现 遍历操作 操作接口 voidPrintList 2 3线性表的链接存储结构及实现 templatevoidLinkList PrintList p first next while p NULL coutdata p p next 单链表的实现 按位查找 操作接口 DataTypeGet inti 2 3线性表的链接存储结构及实现 first a1 a2 an ai 1 工作指针p初始化 累加器count初始化 2 重复执行下述操作 直到p为空 2 1工作指针p后移 2 2count 3 返回累加器count的值 templateintLinkList Length p first next count 0 while p NULL p p next count returncount 注意count的初始化和返回值之间的关系 2 3线性表的链接存储结构及实现 单链表的实现 按位查找 算法描述 C 描述 templateintLinkList Locate DataTypex p first next count 1 while p NULL if p data x returncount 查找成功 返回序号p p next count return0 退出循环表明查找失败 2 3线性表的链接存储结构及实现 单链表的实现 按值查找 算法描述 C 描述 单链表的实现 插入 操作接口 voidInsert inti DataTypex 2 3线性表的链接存储结构及实现 如何实现结点ai 1 x和ai之间逻辑关系的变化 算法描述 s newNode s data x s next p next p next s 注意分析边界情况 表头 表尾 单链表的实现 插入 2 3线性表的链接存储结构及实现 first a1 an ai 算法描述 s newNode s data x s next p next p next s 由于单链表带头结点 表头 表中 表尾三种情况的操作语句一致 算法描述 伪代码 1 工作指针p初始化 2 查找第i 1个结点并使工作指针p指向该结点 3 若查找不成功 则插入位置不合理 抛出插入位置异常 否则 3 1生成一个元素值为x的新结点s 3 2将新结点s插入到结点p之后 2 3线性表的链接存储结构及实现 单链表的实现 插入 templatevoidLinkList Insert inti DataTypex p first count 0 工作指针p应指向头结点while p NULL 结点s插入结点p之后 2 3线性表的链接存储结构及实现 单链表的实现 插入 基本语句 时间复杂度 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 头插法 将待插入结点插在头结点的后面 算法描述 first newNode first next NULL 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 头插法 将待插入结点插在头结点的后面 2 3线性表的链接存储结构及实现 算法描述 s newNode s data a 0 s next first next first next s 插入第一个元素结点 first 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 头插法 将待插入结点插在头结点的后面 2 3线性表的链接存储结构及实现 算法描述 s newNode s data a 1 s next first next first next s 依次插入每一个结点 templateLinkList LinkList DataTypea intn first newNode first next NULL for i 0 idata a i s next first next first next s 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 尾插法 将待插入结点插在终端结点的后面 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 算法描述 first newNode rear first 尾插法 将待插入结点插在终端结点的后面 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 算法描述 s newNode s data a 0 rear next s rear s 插入第一个元素结点 尾插法 将待插入结点插在终端结点的后面 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 算法描述 s newNode s data a 1 rear next s rear s 依次插入每一个结点 35 尾插法 将待插入结点插在终端结点的后面 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 操作接口 LinkList DataTypea intn 算法描述 rear next NULL 最后一个结点插入后 35 templateLinkList LinkList DataTypea intn first newNode 生成头结点r first 尾指针初始化for i 0 i s data a i r next s r s r next NULL 2 3线性表的链接存储结构及实现 单链表的实现 构造函数 算法描述 单链表的实现 删除 操作接口 DataTypeDelete inti 2 3线性表的链接存储结构及实现 如何实现结点ai 1和ai之间逻辑关系的变化 算法描述 q p next x q data p next q next deleteq 单链表的实现 删除 2 3线性表的链接存储结构及实现 算法描述 q p next x q data p next q next deleteq 注意分析边界情况 表头 表尾 表尾的特殊情况 虽然被删结点不存在 但其前驱结点却存在 p next NULL 算法描述 伪代码 1 工作指针p初始化 2 查找第i 1个结点并使工作指针p指向该结点 3 若p不存在或p不存在后继结点 则抛出位置异常 否则 3 1暂存被删结点和被删元素值 3 2摘链 将结点p的后继结点从链表上摘下 3 3释放被删结点 3 4返回被删元素值 2 3线性表的链接存储结构及实现 单链表的实现 删除 templateDataTypeLinkList Delete inti p first count 0 while p NULL 2 3线性表的链接存储结构及实现 单链表的实现 删除 单链表的实现 析构函数 析构函数将单链表中所有结点的存储空间释放 2 3线性表的链接存储结构及实现 操作接口 LinkList first a1 a2 an ai 算法描述 q first first first next deleteq 注意 保证链表未处理的部分不断开 单链表的实现 析构函数 templateLinkList LinkList while first NULL q first first first next deleteq 2 3线性表的链接存储结构及实现 算法描述 启示 算法设计的一般过程 算法设计的一般步骤 第一步 确定入口 已知条件 出口 结果 第二步 根据一个小实例画出示意图 第三步 正向思维 选定一个思考问题的起点 逐步提出问题 解决问题 逆向思维 从结论出发分析为达到这个结论应该先有什么 正逆结合 第四步 写出顶层较抽象算法 分析边界情况 第五步 验证第四步的算法 第六步 写出具体算法 第七步 进一步验证 手工运行 循环链表 first a1 ai 1 an ai 从单链表中某结点p出发如何找到其前驱 将单链表的首尾相接 将终端结点的指针域由空指针改为指向头结点 构成单循环链表 简称循环链表 2 3线性表的链接存储结构及实现 循环链表 2 3线性表的链接存储结构及实现 first a1 ai 1 an ai 循环链表 插入 算法描述 s newNode s data x s next p next p next s 2 3线性表的链接存储结构及实现 templatevoidLinkList Insert inti DataTypex p first count 0 while p first 循环链表 插入 与单链表的插入操作相比 差别是什么 2 3线性表的链接存储结构及实现 循环条件 p NULL p firstp next NULL p next first 循环链表 2 3线性表的链接存储结构及实现 如何查找开始结点和终端结点 循环链表 开始结点 first next终端结点 将单链表扫描一遍 时间为O n 2 3线性表的链接存储结构及实现 开始结点 rear next next终端结点 rear 循环链表 带尾指针的循环链表 一个存储结构设计得是否合理 取决于基于该存储结构的运算是否方便 时间性能是否提高 2 3线性表的链接存储结构及实现 双链表 如何求结点p的直接前驱 时间性能 为什么可以快速求得结点p的后继 如何快速求得结点p的前驱 2 3线性表的链接存储结构及实现 双链表 在单链表的每个结点中再设置一个指向其前驱结点的指针域 双链表 结点结构 data 数据域 存储数据元素 prior 指针域 存储该结点的前趋结点地址 next 指针域 存储该结点的后继结点地址 2 3线性表的链接存储结构及实现 templatestructDulNode DataTypedata DulNode prior next 双链表 启示 时空权衡 空间换取时间 定义结点结构 2 3线性表的链接存储结构及实现 双链表的操作 插入 s prior p s next p next p next prior s p next s ai 1 ai 操作接口 voidInsert DulNode p DataTypex 注意指针修改的相对顺序 2 3线性表的链接存储结构及实现 双链表的操作 删除 p prior next p next p next prior p prior 操作接口 DataTypeDelete DulNode p ai 1 ai ai 结点p的指针是否需要修改 deletep 2 3线性表的链接存储结构及实现 存储分配方式比较 顺序表采用顺序存储结构 即用一段地址连续的存储单元依次存储线性表的数据元素 数据元素之间的逻辑关系通过存储位置来实现 链表采用链接存储结构 即用一组任意的存储单元存放线性表的元素 用指针来反映数据元素之间的逻辑关系 2 4顺序表和链表的比较 2 4顺序表和链表的比较 时间性能比较 时间性能是指实现基于某种存储结构的基本操作 即算法 的时间复杂度 按位查找 顺序表的时间为 1 是随机存取 链表的时间为 n 是顺序存取 插入和删除 顺序表需移动表长一半的元素 时间为 n 链表不需要移动元素 在给出某个合适位置的指针后 插入和删除操作所需的时间仅为 1 2 4顺序表和链表的比较 空间性能比较 空间性能是指某种存储结构所占用的存储空间的大小 定义结点的存储密度 结点的存储密度 顺序表 结点的存储密度为1 只存储数据元素 没有浪费空间 链表 结点的存储密度 1 包括数据域和指针域 有指针的结构性开销 2 4顺序表和链表的比较 空间性能比较 空间性能是指某种存储结构所占用的存储空间的大小 定义结点的存储密度 结构的存储密度 顺序表 需要预分配存储空间 如果预分配得过大 造成浪费 若估计得过小 又将发生上溢 链表 不需要预分配空间 只要有内存空间可以分配 单链表中的元素个数就没有限制 结论 若线性表需频繁查找却很少进行插入和删除操作 或其操作和元素在表中的位置密切相关时 宜采用顺序表作为存储结构 若线性表需频繁插入和删除时 则宜采用链表做存储结构 当线性表中元素个数变化较大或者未知时 最好使用链表实现 而如果用户事先知道线性表的大致长度 使用顺序表的空间效率会更高 2 4顺序表和链表的比较 总之 线性表的顺序实现和链表实现各有其优缺点 不能笼统地说哪种实现更好 只能根据实际问题的具体需要 并对各方面的优缺点加以综合平衡 才能最终选定比较适宜的实现方法 静态链表 用数组来表示单链表 用数组元素的下标来模拟单链表的指针 静态链表 2 5线性表的其它存储方法 data 存储放数据元素 next 也称游标 存储该元素的后继在数组的下标 数组元素 结点 的构成 数据域 指针域 例 线性表 张 王 李 赵 吴 的静态链表存储 012345678 2 5线性表的其它存储方法 datanext 静态链表 first avail first 静态链表头指针 为了方便插入和删除操作 通常静态链表带头结点 avail 空闲链表头指针 空闲链表由于只在表头操作 所以不带头结点 2 5线性表的其它存储方法 静态链表 静态链表的存储结构定义如下 constintMaxSize 100 100只是示例数据templatestructSNode DataTypedata DataType表示不确定的数据类型intnext 指针域 也称游标 SList MaxSize 在线性表 张 王 李 赵 吴 中 王 之后插入 孙 012345678 2 5线性表的其它存储方法 datanext 静态链表 2 5线性表的其它存储方法 静态链表 假设结点s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论