收藏 分享(赏)

第02章线性表A.ppt

上传人:gnk289057 文档编号:9226480 上传时间:2019-07-30 格式:PPT 页数:32 大小:558KB
下载 相关 举报
第02章线性表A.ppt_第1页
第1页 / 共32页
第02章线性表A.ppt_第2页
第2页 / 共32页
第02章线性表A.ppt_第3页
第3页 / 共32页
第02章线性表A.ppt_第4页
第4页 / 共32页
第02章线性表A.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、第1章 绪论 第2章 线性表 第3章 栈和队列 第4章 串 第5章 数组和广义表 第6章 树和二叉树 第7章 图 第9章 查找 第10章 排序,目 录,数据结构课程的起点,什么是 线性结构?,线性结构的定义:,若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。 可表示为:(a1 , a2 , , an),简言,线性结构反映结点间的逻辑关系是 。,特点 只有一个首结点和尾结点; 特点 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。,线性结构包括:线性表、堆栈、队列、字符串、数组等,其中最典型、最常用的是-,线性表,一对一(1:1)

2、,第2章 线性表,2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 应用举例,(a1, a2, ai-1,ai, ai1 ,, an),2.1 线性表的逻辑结构,线性表的定义:用数据元素的有限序列表示,数据元素,线性起点,ai的直接前趋,ai的直接后继,下标,是元素的序号,表示元素在表中的位置,n为元素总个数,即表长。n0,空表,线性终点,( A, B, C, D, , Z),例2 分析学生情况登记表是什么结构。,分析:数据元素都是同类型(记录),元素间关系是线性的。,分析: 数据元素都是同类型(字母), 元素间关系是线性的。,注意:同一线性表中

3、的元素必定具有相同特性 !,例1 分析26 个英文字母组成的英文表是什么结构。,“同一数据逻辑结构中的所有数据元素都具有相同的特性”是指数据元素所包含的数据项的个数都相等。,是指各元素具有相同的数据类型,试判断下列叙述的正误:,2.2 线性表的顺序表示和实现,2.2.1 顺序表的表示 2.2.2 顺序表的实现 2.2.3 顺序表的运算效率分析,2.2.1 顺序表的表示,用一组地址连续的存储单元依次存储线性表的元素。,把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。,线性表的顺序表示又称为顺序存储结构或顺序映像。,顺序存储定义:,顺序存储方法:,特点:,逻辑上相邻的元素,物理上也相

4、邻,可以利用数组Vn来实现,注意:在C语言中数组的下标是从0开始,即:Vn的有效范围是从 V0Vn-1,1. 逻辑上相邻的数据元素,其物理上也相邻; 2. 若已知表中首元素在存储器中的位置,则其他元素存放位置亦可求出(利用数组Vn的下标)。,设首元素a1的存放地址为LOC(a1)(称为首地址), 设每个元素占用存储空间(地址长度)为L字节, 则表中任一数据元素的存放地址为:LOC ( ai+1 ) = LOC( ai ) + L LOC ( ai ) = LOC( a1 ) + L *(i -1),对上述公式的解释如图所示,线性表顺序存储特点:,地址 内容 元素在表中的位序,1,i,2,n,空

5、闲区,i+1,L,b=LOC(a1),b + L,b +(i-1)L,b +(n-1)L,b +(max-1)L,LOC ( ai ) = LOC( a1 ) + L *(i -1),线性表的顺序存储结构示意图,下标起点是1,设有一维数组,下标的范围是到,每个数组元素用相邻的个字节存储。存储器按字节编址,设存储数组元素的第一个字节的地址是98,则的第一个字节的地址是多少?,答案:113,但此题要注意下标起点是从0开始: LOC( M3 ) = 98 + 5 (4-1) =113,解:已知地址计算通式为:,LOC(ai) = LOC(a1) + L *(i-1),例1,char V30; voi

6、d build() /*字母线性表的生成,即建表操作*/ int i;V0=a;for( i=1; i=n-1; i+ ) Vi=Vi-1+1; ,核心语句: 法1 Vi= Vi-1+1; 法2 Vi=a+i; 法3 Vi=97+i;,例2,用数组V来存放26个英文字母组成的线性表(a,b,c,z),写出在顺序结构上生成和显示该表的C语言程序。,省略了include语句,void main( ) /*主函数,字母线性表的生成和输出*/ n=26; /* n是表长,是数据元素的个数,而不是V的实际下标*/build( );display( ); ,void display( ) /*字母线性表的

7、显示,即读表操作*/ int i;for( i=0; i=n-1; i+ )printf( “%c“, vi );printf( “n “ ); ,执行结果: a b c d e f g h i j k l m n o p q r s t u v w x y z,2.2.2 顺序表的实现(或操作),数据结构的基本运算:修改、插入、删除、查找、排序,1) 修改: 通过数组的下标便可访问某个特定元素并修改。,Vi=x;,显然,顺序表修改操作的时间效率是 O(1),核心语句:,在线性表的第i个位置前插入一个元素,实现步骤: 将第n至第i 位的元素向后移动一个位置; 将要插入的元素写到第i个位置; 表

8、长加1。 注意:事先应判断: 插入位置i 是否合法?表是否已满? 应当符合条件: 1in+1 或 i=1, n+1,for (j=n; j=i; j-)aj+1=a j ; a i =x; n+;,/ 元素后移一个位置,/ 插入x,/ 表长加1,核心语句,2)插入:,在线性表的第i个位置前插入一个元素的示意图:,插入25,实现步骤: 将第i+1 至第n 位的元素向前移动一个位置; 表长减1。 注意:事先需要判断,删除位置i 是否合法? 应当符合条件:1in 或 i=1, n,删除线性表的第i个位置上的元素,for ( j=i+1; j=n; j+ )aj-1=aj; n-;,/ 元素前移一个位

9、置,/ 表长减1,核心语句:,3)删除:,删除顺序表中某个指定的元素的示意图:,顺序表插入和删除的完整程序请同学们自编。,2.2.3 顺序表的运算效率分析,算法时间主要耗费在移动元素的操作上,因此计算时间复杂度的基本操作(最深层语句频度)T(n)= O (移动元素次数)而移动元素的个数取决于插入或删除元素的位置.,思考:若插入在尾结点之后,则根本无需移动(特别快); 若插入在首结点之前,则表中元素全部要后移(特别慢); 应当考虑在各种位置插入(共n+1种可能)的平均移动次数才合理。,讨论1:若在长度为 n 的线性表的第 i 位前 插入一个元素,则向后移动元素的次数f(n)为:f(n) =,n

10、i + 1,时间效率分析:,推导:假定在每个元素位置上插入x的可能性都一样(即概率P相同),则应当这样来计算平均执行时间: 将所有位置的执行时间相加,然后取平均。 若在首结点前插入,需要移动的元素最多,后移次数为n; 若在a1后面插入,要后移n-1个元素,后移次数为n-1; 若在an-1后面插入,要后移次数为1; 若在尾结点an之后插入,则后移次数为0;,故插入时的平均移动次数为:n(n+1)/2(n+1)n/2O(n),共有多少种插入形式?连头带尾有n+1种!,所有可能的元素移动次数合计: 0+1+n = n(n+1)/2,同理可证:顺序表删除一元素的时间效率为: T(n)=(n-1)/2

11、O(n),想一想: 顺序表插入、删除算法的平均空间复杂度为多少?,插入效率:,删除效率:,教材P25算法2.5也是对执行效率的推导:,因为没有占用辅助空间!,O(1),即插入、删除算法的平均时间复杂度为 O(n),课堂讨论,顺序表各种操作算法的“通式” 该如何书写? 采用抽象数据类型来表示,顺序表的存储结构是一维数组,如果插入的元素个数超过数组定义的长度怎么办? 采用动态分配的一维数组,线性表的抽象数据类型定义(见教材P19),ADT List 数据对象:D=ai | aiElemSet, i=1,2,n,n0 数据关系:R1= | ai 1, ai D, i=2,n 基本操作:,初始化、撤销

12、、清空、判空; 求表长、表头、表尾、前趋、后继; 读元素、查找(含定位)、遍历; 插入、删除, ADT List,线性表的基本操作如何表示? (见教材P19),InitList( / “看”表中全部元素(遍历),初始化、撤销、清空、判空; 求表长、表头、表尾、前趋、后继; 读元素、查找(含定位)、遍历; 插入、删除,顺序表操作的典型例子,教材例2-1:求两个线性表的“并”,即: LA U LB = ?,算法至少有两种: LA和LB都是无序表,则从LB中取元素逐一与LA中所有元素比较,相同则不插入LA中; 若LA和LB已经是有序表,则“归并”的时间效率可以大大提高。,动态数组简介,先为顺序表空间

13、设定一个初始分配量,一旦因插入元素而空间不足时,可为顺序表增加一个固定长度的空间增量。,#define LIST_INIT_SIZE 100 /存储空间的初始分配量 #define LISTINCREMENT 10/存储空间的分配增量 typedef structElemType *elem; /表基址(用指针*elem表示)int length; /表长度(表中有多少个元素)int listsize; /当前分配的表尺寸(字节单位) SqList;,注:三个分量可简写为:L.elem L.length L.listsize,存储结构描述如下(见教材P22):,数据类型待定,sizeof(x)

14、算符:计算变量x的长度(字节数),malloc (m)函数:新开一片大小为m字节的连续空间,并把该区首址作为函数返回值。,Status InitList_Sq( SqList /InitList_S,动态创建一个空顺序表的算法:,realloc (*p, newsize)函数:新开一片大小为newsize的连续空间,并把以*p为首址的原空间数据都拷贝进去。,动态顺序表的插入算法 Status ListInsert_Sq(SqList &L, int i, ElemType e) /在顺序线性表中第i个位置之前插入新的元素e,if( i L.length+1) return ERROR; / 检

15、验i 值的合法性,if ( L.length L.listsize ) /若表长超过表尺寸则要增加尺寸 newbase = ( ElemType* ) realloc ( L.elem , (L.listsize + LISTINCREMENT )* sizeof ( ElemType ) );,if (newbase=NULL )exit( OVERFLOW ) ; /分配失败则退出并报错L.elem = newbase ; /重置新基址L.listsize = L.listsize + LISTINCREMENT ; /增加表尺寸 ,q = /插入e,+L.length ; /增加1个数据

16、元素,则表长+1,return OK ; /ListInsert_Sq,动态数组的核心是realloc(void *ptr, newsize)函数!,动态顺序表的删除算法 Status ListDelete_Sq(SqList &L, int i, ElemType &e) /在顺序表L中删除第 i 个元素,用 e 返回其值,if (i L.length) return ERROR; / i 值不合法,返回,p= /被删除元素的值赋给 e,q=L.elem+L.length-1; / q 是表尾的位置for(+p; p=q; p+) *(p-1) = *p; /待删元素后面的统统前移,-L.length; /表长 - 1,return OK; /ListDelete_Sq,链式存储结构,2.2节小结,线性表顺序存储结构特点:逻辑关系上相邻的两个元素在物理存储位置上也相邻; 优点:可以随机存取表中任一元素,方便快捷; 缺点:在插入或删除某一元素时,需要移动大量元素。 解决问题的思路:改用另一种线性存储方式:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报