第二章 线性表g.ppt

第二章 线性表 线性结构是一个数据元素的有序(次序)集 。 线性结构的基本特征: (1)存在唯一的一个被称作“第一个”的数据元素 (2)存在唯一的一个被称作“最后一个”的数据元素 (3)除第一个外,集合中的每个数据元素均只有 一个前驱 (4)除最后一个外,集合中的每个数据元素均只有一个后继 线性表:n个数据元素组成的有限序列。表示为: (a1,a2,…, ai-1 , ai,ai+1,…,an) 抽象数据类型的定义只考虑逻辑结构和基本操作的数学特性,了解即可. 其它操作可以借助最小操作子集(插入,删除等)完成.但在数据结构学习中不是重点. 重点掌握下面将讨论的存储结构(表示)和基于某个存储结构基本操作的如何实现(算法编程) 线性表的顺序表示: 用一组地址连续的储存单元依次储存线性表的数据元素。 顺序表: 定义:顺序储存结构表示的线性表。 元素地址计算方法: LOC(ai+1) = LOC(ai) + L LOC(ai) = LOC(a1) + (i-1)*L (地址定位公式) 其中: L— 一个元素占用的存储单元个数 LOC(ai)—线性表第i个元素的地址 插入操作ListInsert_Sq(L, i, e)的算法思想 1. 在第 i 个数据元素之前插入一个数据元素e 2.插入后表长发生变化(变长),应采用动态分配内存 3.由于采用顺序存储结构,插入后要保持逻辑相邻物理也相邻,必需移动数据元素 4.插入后表长应加 1 算法时间复杂度T(n) 设Pi是在第i个元素之前插入一个元素的概率,则在长度为n的线性表中插入一个元素时,所需移动的元素次数的平均次数为: 删除操作ListDelete(L, i, e)的算法思想 1.由于采用顺序存储结构,删除后要保持逻辑相邻物理也相邻,必需移动数据元素 2.删除后表长应减 1 算法评价 设Qi是删除第i个元素的概率,则在长度为n的线性表中删除一个元素所需移动的元素次数的平均次数为: 顺序存储结构的优缺点 优点 逻辑相邻,物理相邻(隐含表示逻辑关系) 可随机存取任一元素 节省存储空间 缺点 插入、删除操作需要移动大量的元素 需预先分配较大空间分配,利用不充分 表容量难以扩充 ? 算法是否唯一 ? 设计一就地(高效)逆置算法 ?ai 和 aj 交换位置移动次数 单链表 用一组任意的存储单元存储线性表的数据元素。 … 单链表的优点 它是一种动态分配结构,整个存储空间可为多个链表共用 不需预先分配空间 插入、删除操作方便,不需移动 单链表的缺点 指针占用额外存储空间,空间开销比顺序 表大. 不能随机存取,查找速度慢 双向链表 1.试写一算法,对单链表实现就地(高效)逆置,即利用原表的存储空间将线性表 (a1,a2,…,an)逆置为(an,an-1,…,a1) 提示:将原链表中的头结点和第一个元素结点断开(令其指针域为空),先构成一个空表,然后将原链表中各结点从第一个结点起依次插入这个新表的头部。 2.试写一算法,将双向链表逆置(高效) 例如:逆位序输入 n 个数据元素的值, 建立带头结点的单链表。 操作步骤: 一、建立一个“空表”; 二、输入数据元素an, 建立结点并插入; 三、输入数据元素an-1, 建立结点并插入; an an an-1 四、循环直至输入a1为止。 void CreateList_L(LinkList L, int n) { // 逆序输入 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(p-data); // 输入元素值 p-next = L-next; L-next = p; // 插入 } ? 写出按正位序建立一个单链表的算法。 最后一个结点的指针域的指针又指回第一个结点的链表。 a1 a2 … ... an 循环链表 较单链表的区别仅在于,判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。 其他形式的链表 H typedef struct DuLNode { ElemType data; // 数据域

文档评论(0)

1亿VIP精品文档

相关文档