第二章 线性表_第1页
第二章 线性表_第2页
第二章 线性表_第3页
第二章 线性表_第4页
第二章 线性表_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第二章线性表 主讲人 彭延军 2 本章主要介绍线性表的定义和抽象数据类型 线性表的顺序存储结构以及每种线性表操作在顺序存储结构上的具体实现 链接存储的概念 线性表的链接存储结构以及每种线性表操作在链接存储结构上的具体实现等内容 通过本章学习 要求同学们 掌握线性表的顺序存储结构和抽象数据类型中定义的每一种操作的含义 在顺序存储方式下每一种操作的具体实现和相应的时间复杂度 掌握链接存储的概念 线性表的单 双链接存储结构 对它们进行插入和删除结点的方法 利用数组建立单链表的方法 循环单 双链表和带表头附加结点的单 双链表的结构和操作特点 掌握每一种线性表操作在由动态结点构成的单链表上具体实现的算法以及相应的时间复杂度 学习目标 3 线性结构的基本特征为 3 除最后元素在外 均有唯一的后继 4 除第一元素之外 均有唯一的前驱 在数据元素的非空有限集中 线性表是一种最简单的线性结构 1 集合中必存在唯一的一个 第一元素 2 集合中必存在唯一的一个 最后元素 4 2 1线性表的类型定义 5 抽象数据类型线性表的定义如下 ADTList 数据对象 D ai ai ElemSet i 1 2 n n 0 称n为线性表的表长 称n 0时的线性表为空表 数据关系 R1 ai 1 ai D i 2 n 设线性表为 a1 a2 ai an 称i为ai在线性表中的位序 6 基本操作 结构初始化操作 结构销毁操作 引用型操作 加工型操作 ADTList 7 InitList L 操作结果 构造一个空的线性表L 初始化操作 8 结构销毁操作 DestroyList L 初始条件 操作结果 线性表L已存在 销毁线性表L 9 ListEmpty L ListLength L PriorElem L cur e pre e NextElem L cur e next e GetElem L i e LocateElem L e compare ListTraverse L visit 引用型操作 10 ListEmpty L 初始条件 操作结果 线性表L已存在 若L为空表 则返回TRUE 否则FALSE 线性表判空 11 ListLength L 初始条件 操作结果 线性表L已存在 返回L中元素个数 求线性表的长度 12 PriorElem L cur e pre e 初始条件 操作结果 线性表L已存在 若cur e是L的元素 但不是第一个 则用pre e返回它的前驱 否则操作失败 pre e无定义 求数据元素的前驱 13 NextElem L cur e next e 初始条件 操作结果 线性表L已存在 若cur e是L的元素 但不是最后一个 则用next e返回它的后继 否则操作失败 next e无定义 求数据元素的后继 14 GetElem L i e 初始条件 操作结果 线性表L已存在 且1 i LengthList L 用e返回L中第i个元素的值 求线性表中某个数据元素 15 LocateElem L e compare 初始条件 操作结果 线性表L已存在 e为给定值 compare 是元素判定函数 返回L中第1个与e满足关系compare 的元素的位序 若这样的元素不存在 则返回值为0 定位函数 16 ListTraverse L visit 初始条件 操作结果 线性表L已存在 Visit 为某个访问函数 依次对L的每个元素调用函数visit 一旦visit 失败 则操作失败 遍历线性表 17 加工型操作 ClearList L PutElem L i e ListInsert L i e ListDelete L i e 18 ClearList L 初始条件 操作结果 线性表L已存在 将L重置为空表 线性表置空 19 PutElem L i e 初始条件 操作结果 线性表L已存在 且1 i LengthList L L中第i个元素赋值同e的值 改变数据元素的值 20 ListInsert L i e 初始条件 操作结果 线性表L已存在 且1 i LengthList L 1 在L的第i个元素之前插入新的元素e L的长度增1 插入数据元素 21 ListDelete L i e 初始条件 操作结果 线性表L已存在且非空 1 i LengthList L 删除L的第i个元素 并用e返回其值 L的长度减1 删除数据元素 22 利用上述定义的线性表可以实现其它更复杂的操作 例2 2 例2 3 例2 1 23 要求对线性表作如下操作 扩大线性表LA 将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去 上述问题可演绎为 24 1 从线性表LB中依次察看每个数据元素 2 依值在线性表LA中进行查访 3 若不存在 则插入之 GetElem LB i e LocateElem LA e equal ListInsert LA n 1 e 操作步骤 25 GetElem Lb i e 取Lb中第i个数据元素赋给eif LocateElem La e equal ListInsert La La len e La中不存在和e相同的数据元素 则插入之 voidunion List for i 1 i Lb len i union 26 已知一个非纯集合B 试构造一个纯集合A 使A中只包含B中所有值各不相同的数据元素 仍选用线性表表示集合 例2 2 27 从集合B取出物件放入集合A要求集合A中同样物件不能有两件以上 因此 算法的策略应该和例2 1相同 集合B 集合A 28 voidunion List union GetElem Lb i e 取Lb中第i个数据元素赋给eif LocateElem La e equal ListInsert La La len e La中不存在和e相同的数据元素 则插入之 for i 1 i Lb len i InitList La 构造 空的 线性表LA 29 若线性表中的数据元素相互之间可以比较 并且数据元素在线性表中依值非递减或非递增有序排列 即ai ai 1或ai ai 1 i 2 3 n 则称该线性表为有序表 OrderedList 试改变结构 以有序表表示集合 30 例如 2 3 3 5 6 6 6 8 12 对集合B而言 值相同的数据元素必定相邻 对集合A而言 数据元素依值从小至大的顺序插入 因此 数据结构改变了 解决问题的策略也相应要改变 31 voidpurge Listi purge基于有序表构造一个纯集合 GetElem Lb i e 取Lb中第i个数据元素赋给eif ListEmpty La equal en e ListInsert La La len e en e La中不存在和e相同的数据元素 则插入之 32 已知线性表LA和LB中的数据元素按值非递减有序排列 先要求将LA和LB归并为一个新的线性表LC 且LC中的数据元素仍按值非递减有序排列 如 LA 3 5 8 11 LB 2 6 8 9 11 15 20 则 LC 2 3 5 6 8 8 9 11 11 15 20 例2 3 33 1 初始化LC为空表 基本操作 2 分别从LA和LB中取得当前元素ai和bj 3 若ai bj 则将ai插入到LC中 否则将bj插入到LC中 4 重复2和3两步 直至LA或LB中元素被取完为止 5 将LA表或LB表中剩余元素复制插入到LC表中 34 情况1 La和Lb均非空 i j 1 k 0GetElem La i ai GetElem Lb j bj if ai bj 将ai插入到Lc中ListInsert Lc k ai i else 将bj插入到Lc中ListInsert Lc k bj j 35 while i La len 当La不空时GetElem La i ai ListInsert Lc k ai 插入La表中剩余元素 while j Lb len 当Lb不空时GetElem Lb j bj ListInsert Lc k bj 插入Lb表中剩余元素 情况3 ListLength La ListLength Lb 0 情况2 ListLength La ListLength Lb 0 36 voidMergeList ListLa ListLb List Lc 本算法将非递减的有序表La和Lb归并为Lc merge list while i La len j Lb len 情况1 La和Lb均不空 while i La len 情况2 若La不空 while j Lb len 情况3 若Lb不空 InitList Lc 构造空的线性表Lci j 1 k 0 La len ListLength La Lb len ListLength Lb 37 2 2线性表类型的实现 顺序映象 38 最简单的一种顺序映象方法是 令y的存储位置和x的存储位置相邻 顺序映象 以x的存储位置和y的存储位置之间某种关系表示逻辑关系 39 用一组地址连续的存储单元依次存放线性表中的数据元素 a1a2 ai 1ai an 线性表的起始地址称作线性表的基地址 40 数据结构教程 以 存储位置相邻 表示有序对即 LOC ai LOC ai 1 C 所有数据元素的存储位置均取决于第一个数据元素的存储位置LOC ai LOC a1 i 1 C 一个数据元素所占存储量 基地址 41 顺序映像的C语言描述 typedefstruct SqList 俗称顺序表 defineLIST INIT SIZE80 线性表存储空间的初始分配量 defineLISTINCREMENT10 线性表存储空间的分配增量 ElemType elem 存储空间基址 intlength 当前长度 intlistsize 当前分配的存储容量 以sizeof ElemType 为单位 42 线性表的基本操作在顺序表中的实现 InitList L 结构初始化 LocateElem L e compare 查找 ListInsert L i e 插入元素 ListDelete L i 删除元素 43 StatusInitList Sq SqList L 构造一个空的线性表 InitList Sq 算法时间复杂度 O 1 L elem ElemType malloc LIST INIT SIZE sizeof ElemType if L elem exit OVERFLOW L length 0 L listsize LIST INIT SIZEreturnOK 44 例如 顺序表 38 i 1 2 3 4 1 8 50 可见 基本操作是 将顺序表中的元素逐个和给定值e相比较 45 intLocateElem Sq SqListL ElemTypee Status compare ElemType ElemType 在顺序表中查询第一个满足判定条件的数据 元素 若存在 返回它的位序 否则返回0 LocateElem Sq O ListLength L 算法的时间复杂度为 i 1 i的初值为第1元素的位序p L elem p的初值为第1元素的存储位置 while i L length if i L length returni elsereturn0 46 线性表操作ListInsert L i e 的实现 首先分析 插入元素时 线性表的逻辑结构发生什么变化 47 a1 ai 1 ai an 改变为 a1 ai 1 e ai an 表的长度增加 an 48 StatusListInsert Sq SqList L inti ElemTypee 在顺序表L的第i个元素之前插入新的元素e i的合法范围为1 i L length 1 ListInsert Sq 算法时间复杂度为 O ListLength L q 49 考虑移动元素的平均情况 假设在第i个元素之前插入的概率为 则在长度为n的线性表中插入一个元素所需移动元素次数的期望值为 若假定在线性表中任何一个位置上进行插入的概率都是相等的 则移动元素的期望值为 50 if L length L listsize 当前存储空间已满 增加分配newbase ElemType realloc L elem L listsize LISTINCREMENT sizeof ElemType if newbase exit OVERFLOW 存储分配失败L elem newbase 新基址L listsize LISTINCREMENT 增加存储容量 if iL length 1 returnERROR 插入位置不合法 51 21183075425687 21183075 例如 ListInsert Sq L 5 66 L length 1 87 56 42 66 q 52 线性表操作ListDelete L i e 的实现 首先分析 删除元素时 线性表的逻辑结构发生什么变化 53 a1 ai 1 ai ai 1 an 改变为 a1 ai 1 ai 1 an ai 1 an 表的长度减少 54 StatusListDelete Sq SqList L inti ElemType e ListDelete Sq for p p q p p 1 p 被删除元素之后的元素左移 L length 表长减1returnOK 算法时间复杂度为 O ListLength L p 表尾元素的位置 if iL length returnERROR 删除位置不合法 55 考虑移动元素的平均情况 假设删除第i个元素的概率为 则在长度为n的线性表中删除一个元素所需移动元素次数的期望值为 若假定在线性表中任何一个位置上进行删除的概率都是相等的 则移动元素的期望值为 56 L length 1 87 56 p 例如 ListDelete Sq L 5 e 0 57 2 3线性表类型的实现 链式映象 58 一 单链表 二 结点和单链表的C语言描述 三 线性表的操作在单链表中的实现 四 一个带头结点的单链表类型 五 其它形式的链表 六 有序表类型 59 用一组地址任意的存储单元存放线性表中的数据元素 一 单链表 以元素 数据元素的映象 指针 指示后继元素存储位置 结点 表示数据元素或数据元素的映象 以 结点的序列 表示线性表 称作链表 60 以线性表中第一个数据元素的存储地址作为线性表的地址 称作线性表的头指针 有时为了操作方便 在第一个结点之前虚加一个 头结点 以指向头结点的指针为链表的头指针 头结点 头指针 头指针 空指针 线性表为空表时 头结点的指针域为空 61 TypedefstructLNode ElemTypedata 数据域structLnode next 指针域 LNode LinkList 二 结点和单链表的C语言描述 LinkListL L为单链表的头指针 62 三 单链表操作的实现 GetElem L i e 取第i个数据元素 ListInsert L i e 插入数据元素 ListDelete L i e 删除数据元素 ClearList L 重置线性表为空表 CreateList L n 生成含n个数据元素的链表 63 线性表的操作GetElem L i e 在单链表中的实现 i 3 j 1 2 3 64 因此 查找第i个数据元素的基本操作为 移动指针 比较j和i 单链表是一种顺序存取的结构 为找第i个数据元素 必须先找到第i 1个数据元素 令指针p始终指向线性表中第j个数据元素 65 StatusGetElem L LinkListL inti ElemType e L是带头结点的链表的头指针 以e返回第i个元素 GetElem L 算法时间复杂度为 O ListLength L p L next j 1 p指向第一个结点 j为计数器 while p 顺指针向后查找 直到p指向第i个元素 或p为空 if p j i returnERROR 第i个元素不存在e p data 取得第i个元素returnOK 66 线性表的操作ListInsert L i e 在单链表中的实现 有序对改变为和 67 因此 在单链表中第i个结点之前进行插入的基本操作为 找到线性表中第i 1个结点 然后修改其指向后继的指针 可见 在链表中插入结点只需要修改指针 但同时 若要在第i个结点之前插入元素 修改的是第i 1个结点的指针 68 StatusListInsert L LinkListL inti ElemTypee L为带头结点的单链表的头指针 本算法 在链表中第i个结点之前插入新的元素e LinstInsert L 算法的时间复杂度为 O ListLength L p L j 0 while p i大于表长或者小于1 69 s LinkList malloc sizeof LNode 生成新结点s data e s next p next p next s 插入returnOK ai s p 70 线性表的操作ListDelete L i e 在链表中的实现 有序对和改变为 ai ai 1 71 在单链表中删除第i个结点的基本操作为 找到线性表中第i 1个结点 修改其指向后继的指针 ai 1 ai ai 1 q p next p next q next e q data free q p q 72 StatusListDelete L LinkListL inti ElemType e 删除以L为头指针 带头结点 的单链表中第i个结点 ListDelete L 算法的时间复杂度为 O ListLength L p L j 0 while p next 删除位置不合理 q p next p next q next 删除并释放结点e q data free q returnOK 73 操作ClearList L 在链表中的实现 voidClearList ClearList free p 算法时间复杂度 O ListLength L 74 如何从线性表得到单链表 链表是一个动态的结构 它不需要予分配空间 因此生成链表的过程是一个结点 逐个插入 的过程 75 例如 逆位序输入n个数据元素的值 建立带头结点的单链表 操作步骤 一 建立一个 空表 二 输入数据元素an 建立结点并插入 三 输入数据元素an 1 建立结点并插入 an an an 1 四 依次类推 直至输入a1为止 76 voidCreateList L LinkList L intn 逆序输入n个数据元素 建立带头结点的单链表 CreateList L 算法的时间复杂度为 O Listlength L L LinkList malloc sizeof LNode L next NULL 先建立一个带头结点的单链表 for i n i 0 i p LinkList malloc sizeof LNode scanf 插入 77 静态链表 用数组描述的链表 defineMAXSIZE1000typedefstruct ElemTypedata intcur component SlinkList MAXSIZE 78 012345678 0123456789 插入shi 删除zheng后 79 1 双向链表 五 其它形式的链表 typedefstructDuLNode ElemTypedata 数据域structDuLNode prior 指向前驱的指针域structDuLNode next 指向后继的指针域 DuLNode DuLinkList 80 最后一个结点的指针域的指针又指回第一个结点的链表 a1a2 an 2 循环链表 和单链表的差别仅在于 判别链表中最后一个结点的条件不再是 后继是否为空 而是 后继是否为头结点 81 双向循环链表 空表 非空表 a1a2 an 82 双向链表的操作特点 查询 和单链表相同 插入 和 删除 时需要同时修改两个方向上的指针 83 s next p next p next s s next prior s s prior p p s 插入 84 删除 p next p next next p next prior p p 85 六 有序表类型 ADTOrdered List 数据对象 S xi xi OrderedSet i 1 2 n n 0 集合中任意两个元素之间均可以进行比较 数据关系 R xi 1 xi S xi 1 xi i 2 3 n 回顾例2 2的两个算法 86 LocateElem L e q int compare ElemType ElemType 初始条件 有序表L已存在 操作结果 若有序表L中存在元素e 则q指示L中第一个值为e的元素的位置 并返回函数值TRUE 否则q指示第一个大于e的元素的前驱的位置 并返回函数值FALSE 基本操作 Compare是一个有序判定函数 87 12 23 34 45 56 67 78 89 98 45 例如 若e 45 则q指向 若e 88 则q指向 表示值为88的元素应插入在该指针所指结点之后 88 voidpurge1 List La中不存在和e相同的数据元素 则插入之 union 算法时间复杂度 O n 89 voidpurge2 Listi purge GetElem Lb i e 取Lb中第i个数据元素赋给eif ListEmpty La equal en e ListInsert La La len e en e La中不存在和e相同的数据元素 则插入之 算法时间复杂度 O n 90 2 4一元多项式的表示 91 在计算机中 可以用一个线性表来表示 P p0 p1 pn 一元多项式 但是对于形如S x 1 3x10000 2x20000的多项式 上述表示方法是否合适 92 一般情况下的一元稀疏多项式可写成Pn x p1xe1 p2xe2 pmxem其中 pi是指数为ei的项的非零系数 0 e1 e2 em n 可以下列线性表表示 p1 e1 p2 e2 pm em 93 P999 x 7x3 2x12 8x999 例如 可用线性表 7 3 2 12 8 999 表示 94 ADTPolynomial 数据对象 数据关系 抽象数据类型一元多项式的定义如下 D ai ai TermSet i 1 2 m m 0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数 R1 ai 1 ai D i 2 n且ai 1中的指数值 ai中的指数值 95 CreatPolyn P m DestroyPolyn P PrintPolyn P 基本操作 操作结果 输入m项的系数和指数 建立一元多项式P 初始条件 一元多项式P已存在 操作结果 销毁一元多项式P 初始条件 一元多项式P已存在 操作结果 打印输出一元多项式P 96 PolynLength P AddPolyn Pa Pb SubtractPolyn Pa Pb ADTPolynomial 初始条件 一元多项式P已存在 操作结果 返回一元多项式P中的项数 初始条件 一元多项式Pa和Pb已存在 操作结果 完成多项式相加运算 即 Pa Pa Pb 并销毁一元多项式Pb 97 一元多项式的实现 typedefstruct 项的表示floatcoef 系数intexpn 指数 term ElemType typedefOrderedLinkListpolynomial 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为 98 StatusCreatPolyn polynomail 问题 在链表中会出现指数相同的节点 99 StatusAddPolyn polynomial Pc polynomial Pa polynomial Pb 利用两个多项式的结点构成 和多项式 Pc Pa Pb AddPolyn 100

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论