第二章线性表(LinearList)课件.ppt
《第二章线性表(LinearList)课件.ppt》由会员分享,可在线阅读,更多相关《第二章线性表(LinearList)课件.ppt(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、12类型定义和基本操作类型定义和基本操作顺序表示和实现顺序表示和实现链式表示和实现链式表示和实现应用举例应用举例31. 了解线性表的逻辑结构特性了解线性表的逻辑结构特性数据元素之间存在数据元素之间存在着线性关系;着线性关系;2. 在计算机中表示这种关系的两类不同的存储结构是在计算机中表示这种关系的两类不同的存储结构是顺序存储结构顺序存储结构和和链式存储结构链式存储结构。用前者表示的线性。用前者表示的线性表简称为表简称为顺序表顺序表,用后者表示的线性表简称为,用后者表示的线性表简称为链表链表。 3. 熟练掌握这两类存储结构的熟练掌握这两类存储结构的描述方法描述方法以及线性表的以及线性表的基本操作
2、基本操作在这两种存储结构上的在这两种存储结构上的实现实现。4. 能够从时间和空间复杂度的角度综合比较线性表能够从时间和空间复杂度的角度综合比较线性表两两种存储结构的不同特点种存储结构的不同特点及其及其适用场合适用场合。5. 结合线性表类型的定义增强对抽象数据类型的理解。结合线性表类型的定义增强对抽象数据类型的理解。使用本章所学的基本知识设计有效算法解决与线性使用本章所学的基本知识设计有效算法解决与线性表相关的应用问题。表相关的应用问题。4链表链表是本章的重点和难点。是本章的重点和难点。扎实的指针操作和内存动态分配的编程技术扎实的指针操作和内存动态分配的编程技术是学好本章的基本要求;是学好本章的
3、基本要求;分清链表中指针分清链表中指针 p 和结点和结点 *p 之间的对应关系;之间的对应关系;区分链表中的区分链表中的头结点头结点、头指针头指针和和开始开始结点结点的的不同所指;不同所指;掌握掌握循环链表、双向链表的特点等。循环链表、双向链表的特点等。56&线性表线性表由由n(n0)个数据元素个数据元素(结点结点)a1, a2, a3, ., ai-1, ai, ai+1, ., an组组成的成的有限有限序列。序列。 记作记作,L=(a1, a2, a3, ., ai-1, ai, ai+1, ., an)。其中其中, n为数据元素的个数,称为为数据元素的个数,称为表的长度表的长度; ai为
4、组成该线性表的为组成该线性表的数据元素数据元素; i为为ai在线性表中的在线性表中的位序位序; 当当n=0 时,称为时,称为空表空表。7&线性表的特性线性表的特性线性表中的所有数据元素的数据类型是一致的。线性表中的所有数据元素的数据类型是一致的。数据元素在线性表中的位置只取决于它的序号。数据元素在线性表中的位置只取决于它的序号。结点间的逻辑关系是线性的。结点间的逻辑关系是线性的。8例例1、26个英文字母组成的字母表个英文字母组成的字母表 La=(A,B,C,Z)姓姓 名名学学 号号性性 别别年龄年龄 健康情况健康情况王小林王小林790631男男18健康健康陈陈 红红790632女女20一般一般
5、刘建平刘建平790633男男21健康健康张立立张立立790634男男17神经衰弱神经衰弱 . . . 例例2、某校、某校1978年到年到1983年各型号计算机拥有量的变化情况。年各型号计算机拥有量的变化情况。 Lb=(6,17,28,50,92,188) 例例3、学生健康情况登记表、学生健康情况登记表9抽象数据类型线性表的定义:抽象数据类型线性表的定义:ADT List数据对象数据对象: D= ai | ai ElemSet, i=1, 2, , n, n 0数据关系数据关系: R1= | ai-1, ai D, i=2, , n基本操作基本操作:InitList(&L) 操作结果:操作结果:
6、 构造一个空的线性表构造一个空的线性表L。DestroyList(&L) 初始条件:线性表初始条件:线性表L已存在。已存在。操作结果:销毁线性表操作结果:销毁线性表L。ClearList(&L)初始条件:线性表初始条件:线性表L已存在。已存在。操作结果:将线性表操作结果:将线性表L重置为空表。重置为空表。10ListEmpty(L)初始条件:线性表初始条件:线性表 L 已存在。已存在。操作结果:若操作结果:若 L 为空表,则返回为空表,则返回TRUE,否则返回,否则返回FALSE。ListLength(L)初始条件:线性表初始条件:线性表 L 已存在。已存在。操作结果:返回操作结果:返回 L
7、中数据元素的个数。中数据元素的个数。GetElem(L, i, &e) 初始条件:线性表初始条件:线性表 L 已存在已存在, 1 i ListLength(L)。操作结果:用操作结果:用 e 返回线性表返回线性表 L 中第中第 i 个数据元素的值。个数据元素的值。LocateElem(L, e, compare()初始条件:线性表初始条件:线性表L已存在已存在, compare() 是数据元素判定函数。是数据元素判定函数。操作结果:返回操作结果:返回L中第中第1个与个与e满足关系的数据元素的位序。满足关系的数据元素的位序。 若这样的数据元素不存在,则返回值为若这样的数据元素不存在,则返回值为0
8、。11PriorElem(L, cur_e, &pre_e)初始条件:线性表初始条件:线性表 L 已存在。已存在。操作结果:若操作结果:若cur_e是是L的数据元素,且不是第一个,则用的数据元素,且不是第一个,则用pre_e 返回它的前驱;否则操作失败,返回它的前驱;否则操作失败, pre_e无定义。无定义。NextElem(L, cur_e, &next_e)初始条件:线性表初始条件:线性表 L 已存在。已存在。操作结果:若操作结果:若cur_e是是L的数据元素且不是第一个,则用的数据元素且不是第一个,则用next_e 返回它的后继;否则操作失败,返回它的后继;否则操作失败, next_e无
9、定义。无定义。ListInsert(&L, i, e)初始条件:线性表初始条件:线性表 L 已存在,已存在, 1 i ListLength(L)+1。操作结果:在操作结果:在L 中第中第 i 个位置前插入新的数据元素个位置前插入新的数据元素e,L的长度的长度 加加1。12ListDelete(&L, i, &e)初始条件:线性表初始条件:线性表 L 已存在且非空,已存在且非空, 1 i ListLength(L)。操作结果:删除操作结果:删除L的第的第 i 个数据元素,且用个数据元素,且用e返回其值,返回其值,L的的 长度减长度减1。ListTranverse(L, visit()初始条件:线
10、性表初始条件:线性表 L 已存在。已存在。操作结果:依次对操作结果:依次对L的每个数据元素调用函数的每个数据元素调用函数visit() 。一旦。一旦 visit()失败,则操作失败。失败,则操作失败。ADT List13基本操作:基本操作: 初始化线性表初始化线性表LInitList(&L) 销毁线性表销毁线性表LDestoryList(&L) 引用型操作引用型操作没有改变线性表中的数据元素和数据元素之间的关系没有改变线性表中的数据元素和数据元素之间的关系 判别线性表判别线性表L是否为空表是否为空表ListEmpty(L) 求线性表求线性表L的长度的长度ListLength(L) 获取线性表获
11、取线性表L中的某个数据元素内容中的某个数据元素内容 GetElem(L, i, &e) 返回与返回与e满足关系的数据元素位序满足关系的数据元素位序LocateElem(L,e,compare() 返回线性表返回线性表L中中e的直接前驱元素的直接前驱元素 PriorElem(L, e, &pre_e) 返回线性表返回线性表L中中e的直接后继元素的直接后继元素 NextElem(L, e, &next_e) 遍历线性表遍历线性表L中所有数据元素中所有数据元素 ListTranverse(L, visit()加工型操作加工型操作修改表中的数据元素或元素之间的关系修改表中的数据元素或元素之间的关系 清
12、空线性表清空线性表LClearList(&L) 在线性表在线性表L中插入一个数据元素(前插)中插入一个数据元素(前插)ListInsert(&L, i, e) 删除线性表删除线性表L中第中第i个数据元素个数据元素 ListDelete(&L, i, &e) 14合并合并分拆分拆合并两顺序表合并两顺序表1516&顺序表示顺序表示 用一组用一组连续连续的存储单元(地址连续)依次存放线性表的各数的存储单元(地址连续)依次存放线性表的各数据元素。据元素。 即在顺序表中即在顺序表中逻辑结构相邻的数据元素,其物理位置也相邻逻辑结构相邻的数据元素,其物理位置也相邻。逻辑地址逻辑地址数据元素数据元素存储地址存
13、储地址 数据元素数据元素1a1LOC(a1)a12a2LOC(a1)+ca2iaiLOC(a1)+(i-1)*cainanLOC(a1)+(n-1)*can 表中第一个元素的存储位置作为线性表的起始地址,称表中第一个元素的存储位置作为线性表的起始地址,称作线性表的作线性表的基地址基地址。线性表的这种机内表示,称线性表的这种机内表示,称顺序存储结构顺序存储结构(或(或顺序映顺序映象象),也称也称向量结构向量结构。通常用。通常用数组来描述数据结构中的顺数组来描述数据结构中的顺序存储结构。具有这种存储序存储结构。具有这种存储结构的线性表称结构的线性表称顺序表顺序表。17&顺序表示顺序表示 相邻两数据
14、元素的存储位置计算公式为:相邻两数据元素的存储位置计算公式为:LOC(ai+1)=LOC(ai)+c这里,这里,c为一个数据元素所占据的存储单元数目为一个数据元素所占据的存储单元数目。 线性表中任意一个数据元素的存储位置的计算公式为:线性表中任意一个数据元素的存储位置的计算公式为: LOC(ai)=LOC(a1)+(i-1)*c这里,这里,LOC(a1)为基地址为基地址 只要确定了首地址,线性表中任意数据元素都可以随机存取。只要确定了首地址,线性表中任意数据元素都可以随机存取。所以线性表的顺序存储结构是一种所以线性表的顺序存储结构是一种随机存取的存储结构随机存取的存储结构。逻辑地址逻辑地址数据
15、元素数据元素存储地址存储地址数据元素数据元素1a1LOC(a1)a12a2LOC(a1)+ca2iaiLOC(a0)+(i-1)*cainanLOC(a0)+(n-1)*can18&在在C语言中,实现线性表顺序存储结构的类型定义语言中,实现线性表顺序存储结构的类型定义 #define LIST_INIT_SIZE 100 /线性表存储空间的初始分配量线性表存储空间的初始分配量 #define LISTINCREMENT 10 /线性表存储空间的分配增量线性表存储空间的分配增量 typedef struct ElemType *elem; /指向存放线性表中数据元素的基地址指向存放线性表中数据元
16、素的基地址 int length; /线性表的当前长度线性表的当前长度 int listsize; /当前分配的存储容量当前分配的存储容量(sizeof(ElemType)为单位为单位) SqList;19 算法算法2.3 创建空顺序表创建空顺序表Status InitList_Sq(SqList &L) 算法算法 获取线性表中某个元素内容获取线性表中某个元素内容Status GetElem_Sq(Sqlist L, int i, ElemType &e) 算法算法2.4 顺序表的(前)插入顺序表的(前)插入 Status ListInsert_Sq(SqList &L, int i, Ele
17、mType e) 算法算法2.5 顺序表的删除顺序表的删除 Status ListDelete_Sq(SqList &L, int i, ElemType &e) 算法算法2.7 合并两顺序表合并两顺序表 void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) 20Status InitList_Sq(SqList &L) 初始化算法的思想初始化算法的思想: 根据初始分配量给线性表分配空间;检查分配根据初始分配量给线性表分配空间;检查分配是否成功;是否成功; 初始化各成员变量。初始化各成员变量。21Status InitList_Sq(SqLis
18、t &L) Status InitList_Sq(SqList &L) / 构造一个空的线性表构造一个空的线性表L L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if (!L.elem) exit(OVERFLOW); / 存储分配失败存储分配失败 L.length = 0; / 空表长度为空表长度为0 L.listsize = LIST_INIT_SIZE; / 初始存储容量初始存储容量 return OK; / InitList_Sq22Status GetElem_Sq(Sqlist L, int i, ElemT
19、ype &e) 算法思路算法思路: 若要获取的元素位置超出范围,返回错误信息;若要获取的元素位置超出范围,返回错误信息; 取第取第i个元素给个元素给e,操作成功。,操作成功。23Status GetElem_Sq(Sqlist L, int i, ElemType &e) if (iL.length) return ERROR; /判断判断i值是否合理,若不合理,返回值是否合理,若不合理,返回ERROR e=L.elemi-1; /数组中第数组中第i-1的单元存储着线性表中第的单元存储着线性表中第i个数据元素的内容个数据元素的内容 return OK;24Status ListInsert_S
20、q(SqList &L, int i, ElemType e) 25Status ListInsert_Sq(SqList &L, int i, ElemType e) 插入算法的思想插入算法的思想: 若插入位置不适当,则返回错误信息;若插入位置不适当,则返回错误信息; 若当前存储空间已满,则增加分配空间;若当前存储空间已满,则增加分配空间; 当当1 i n时,则从表尾开始到时,则从表尾开始到i个依次向后移动一个依次向后移动一个位置个位置(共需移动共需移动n-i+1个数据元素个数据元素)。 最后将最后将e存入,表长存入,表长n增增1插入成功。插入成功。26 Status ListInsert_
21、Sq(SqList &L, int i, ElemType e) / 在顺序表在顺序表L中第中第i个位置之前插入新的元素个位置之前插入新的元素e; / i 的合法值为的合法值为 1 i ListLength_Sq(L)+1 if (i L.length+1) return ERROR; / i值不合法值不合法 if (L.length = L.listsize) /当前存储空间已满,增加分配当前存储空间已满,增加分配 ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof (ElemTy
22、pe); if (!newbase) return ERROR; / 存储分配失败存储分配失败 L.elem = newbase; / 新基址新基址 L.listsize += LISTINCREMENT; / 增加存储容量增加存储容量 27 q = &(L.elemi-1); / q为插入位置为插入位置 for (p = &(L.elemL.length-1); p=q; -p) *(p+1) = *p; / 插入位置及之后的元素右移插入位置及之后的元素右移 *q = e; / 插入插入e +L.length; / 表长增表长增1 return OK; / ListInsert_Sq28St
23、atus ListInsert_Sq(SqList &L, int i, ElemType e) 插入算法分析插入算法分析:上述算法上述算法for循环语句的执行次数为循环语句的执行次数为n-i+1;若若i=1, 需移动全部需移动全部n个结点;(最坏:个结点;(最坏:O(n))若若i=n+1(在表尾插入)(在表尾插入), 无需用移动结点,直接插入即无需用移动结点,直接插入即可;(最好:可;(最好:O(1))移动结点的平均次数:移动结点的平均次数:)i(npniiis111按等概率考虑,则按等概率考虑,则pi=1/(n+1)。21211111111111111nnnnnninninpEniniii
24、s)()()()((顺序表插入算法平均约需移动顺序表插入算法平均约需移动一半一半结点。结点。29Status ListDelete_Sq(SqList &L, int i, ElemType &e) 30Status ListDelete_Sq(SqList &L, int i, ElemType &e) 删除算法的思想删除算法的思想: 若删除位置不适当,则返回错误信息;若删除位置不适当,则返回错误信息; 从从i+1开始到表尾开始到表尾n依次向前移动一个位置依次向前移动一个位置(共需共需移动移动n-i个数据元素个数据元素)。 将表长将表长n减减1,删除成功。,删除成功。31 Status Li
25、stDelete_Sq(SqList &L, int i, ElemType &e) / 在顺序表在顺序表L中删除第中删除第i个元素,并用个元素,并用e返回其值返回其值 / i 的合法值为的合法值为 1 i ListLength_Sq(L) if (iL.length) return ERROR; / i值不合法值不合法 p = &(L.elemi-1); /p为被删除元素的位置为被删除元素的位置 e = *p; / 被删除元素的值赋给被删除元素的值赋给e q = L.elem+L.length-1; / 表尾元素的位置表尾元素的位置 for (+p; p=q; +p) *(p-1) = *p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 线性 LinearList 课件
限制150内