数据结构课件(第2章)线性表.ppt_第1页
数据结构课件(第2章)线性表.ppt_第2页
数据结构课件(第2章)线性表.ppt_第3页
数据结构课件(第2章)线性表.ppt_第4页
数据结构课件(第2章)线性表.ppt_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

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

文档简介

1、2020/7/28,1,第二章 线性表,信阳师范学院 计算机与信息技术学院,2020/7/28,数据结构 page 2,信阳师范学院计算机与信息技术学院,主要内容,2.1 线性表概念及基本操作,2.2 线性表的顺序存储和实现,2.3 线性表的链式存储和实现,2.4 一元多项式的表示及相加,2020/7/28,数据结构 page 3,信阳师范学院计算机与信息技术学院,了解线性表逻辑结构的特征; 重点掌握线性表的顺序存储结构和链式存储结构; 掌握在顺序存储结构下,线性表的基本操作实现的算法; 掌握在链式存储结构下,线性表的基本操作实现的算法; 比较线性表两类存储结构的不同特点及适用场合。,学习要点

2、,2020/7/28,第 4 页,数据结构考研辅导,(1)线性表的定义和基本操作。 (2)线性表的实现: 顺序存储结构; 链式存储结构; 线性表的应用,考研大纲要求及分析,1 考纲要求,2020/7/28,第 5 页,数据结构考研辅导,本章虽然讨论的是线性表,但涉及的许多问题都具有一定的普遍性。因此,本章是本课程的重点之一,也是其他后续章节的重要基础。换言之,本章是必考内容,而且可能结合后续章节的相关内容出题上。 顺序表的运算本质上是对数组进行操作,因此,可能会与排序、查找等内容结合出题。单链表由于结构简单、应用灵活、难度适中,是数据结构各类考试的重要考点,所以一定要深刻理解、熟练掌握、灵活运

3、用。,2 考纲分析,2020/7/28,数据结构 page 6,信阳师范学院计算机与信息技术学院,2. 1 线性表的概念,例1、数学中的数列(11,13,15,17,19,21)例2、英文字母表(A, B, C, D, E Z )。例3、某单位的电话号码簿。,一 线性表的逻辑结构,电话号码簿是数据元素 的有限序列,每一数据 元素包括两个数据项, 一个是用户姓名,一个 是对应的电话号码。,线性表是n 个类型相同数据元素的有限序列, 通常记作(a1, a2, a3, , an )。,2020/7/28,数据结构 page 7,信阳师范学院计算机与信息技术学院,设 A=(a1, a2, . , ai

4、 -1, ai , ai+1, , an )是一线性表 同一线性表中的元素必须是同一类型的; 称ai-1 是ai 的直接前驱,ai+1 是ai 的直接后继; 在线性表中,除第一个元素和最后一个元素之外,其他元素都有且仅有一个直接前趋,有且仅有一个直接后继,具有这种结构特征的数据结构称为线性结构。线性表是一种线性数据结构; 性表中元素的个数n称为线性表的长度,n=0时称为空表; ai是线性表的第i 个元素,称i 为数据元素ai 的位序。,说 明,2020/7/28,数据结构 page 8,信阳师范学院计算机与信息技术学院,ADT List 数据对象: D= ai |ai ElemSet, i=1

5、, 2, ,n, n=0 数据关系: R1= | ai-1, ai D,i=2, ,n 或:R2= | ai, ai+1 D, i=1, 2, ,n-1,a1,ai-1,a2,顶点:表示数据元素 边:表示数据元素间的关系,前驱关系,后继关系,图示表示,抽象数据类型线性表的定义如下:,ai,ai+1,an,2020/7/28,数据结构 page 9,信阳师范学院计算机与信息技术学院,1 初始化操作 InitList( /elem数组用于存放各个表元素 / ElemType类型为表元素的类型 int length; /当前线性表长度SqList;,注意: C语言中,数组的下标从0开始排列,第i个元

6、素表示为“数组名i-1”。,顺序表的静态分配顺序存储结构,2020/7/28,数据结构 page 22,信阳师范学院计算机与信息技术学院,#define LIST_INIT_SIZE 100 / 线性表存储空间的初始分配量#define LISTINCREMENT 10 / 线性表存储空间的分配增量typedef struct ElemType * elem; /线性表存储空间基址 int length; /当前线性表长度 int listsize; /当前分配的线性表存储空间大小 /(以sizeof(ElemType)为单位)SqList;,*elem:存放线性表元素的一维数组基址;其存储空

7、间在初始化操作(建空表)时动态分配;,注:,顺序表的动态分配顺序存储结构,2020/7/28,数据结构 page 23,信阳师范学院计算机与信息技术学院,若p已定义为指针变量,且p的初值为 p = (float*) malloc(m*sizeof(float ); 执行语句p = (float*) malloc(m*sizeof(float),计算机将按float 类型变量所占空间的大小(一般为32bit)分配m* sizeof(float)个的存储单元,并将其基址赋值给指针变量p;,回顾,2020/7/28,数据结构 page 26,信阳师范学院计算机与信息技术学院,p,p = (float

8、*) malloc(m*sizeof(float) 图示,2020/7/28,数据结构 page 27,信阳师范学院计算机与信息技术学院,调用free ( p ),2) free ( p ) 功能:将指针变量p所指示的存储空间,回收到系统内存空间中去。,使用方法: . int m = 100; float *p; p = (float*) malloc(m*sizeof(float); / 一旦p所指示的内存空间不再使用, /调用free( ) 回收之 free(p);,2020/7/28,数据结构 page 28,信阳师范学院计算机与信息技术学院,如何在顺序表 上实现线性表的基本操作? 如何

9、建空表?如何求表长? 如何插入?删除?,?,当线性表用顺序表存储时,对线性表各种基本操作实际上就是对存储在内存中的顺序表进行操作。,2020/7/28,数据结构 page 29,信阳师范学院计算机与信息技术学院,1)初始化操作 InitList_Sq( SqList ,初始化操作演示,基本操作的实现,2020/7/28,数据结构 page 30,信阳师范学院计算机与信息技术学院,L.length,L.listsize,L.elem,0 LIST_INIT_SIZE,LIST_INIT_SIZE-1,初始化操作演示,2020/7/28,数据结构 page 31,信阳师范学院计算机与信息技术学院,

10、Status InitList_Sq(SqList /InitList_Sq 算法2.3,初始化操作算法:,2020/7/28,数据结构 page 32,信阳师范学院计算机与信息技术学院,销毁操作图示,2)销毁操作 DetroyList ( SqList ,2)将ai赋值给e;,2020/7/28,数据结构 page 48,信阳师范学院计算机与信息技术学院,Status ListDelete_Sq(SqList /ListDelete_Sq,为初学者易于理解 插入算法,这里通过下标引用L.elem 中的元素。,删除操作算法(算法2.5a),2020/7/28,数据结构 page 49,信阳师范

11、学院计算机与信息技术学院,算法2.5b与算法2.5a 唯一的不同是通过指针p引用L.elem中的元素。,Status ListDelete_Sq(SqList /ListDelete_Sq,删除操作算法(算法2.5b),2020/7/28,数据结构 page 50,信阳师范学院计算机与信息技术学院,由此可见在顺序表中删除一个元素 ,平均要移动表的一半元素。表长为n的顺序表,删除算法的时间复杂度为 O(n),假设在线性表的任何位置删除元素的概率相同,即 qi= 1/n 则,若用qi表示删除顺序表的第i个元素的概率,在长度为n的顺序表中删除一个元素所需移动元素个数数学期望值为:,删除算法时间复杂度

12、分析,2020/7/28,数据结构 page 51,信阳师范学院计算机与信息技术学院,定位操作算法,Status LocateElem_Sq(SqList L, ElemType e) /在顺序线性表L中查找第一个值与e相等的元素的位序 / 若找到,则返回其在L中的位序,否则返回0 i=1; p=L.elem; while(i=L.length/LocateElem_Sq,2020/7/28,数据结构 page 52,信阳师范学院计算机与信息技术学院,有关“+”和“ * ”内容复习,1 由于+和*同优先级,结合方向为自右而左,因此*p+等价于*(p+),作用是先得到p指向的变量的值(即*p )

13、,然后再使p+1=p. 2 *(p+)与*(+p)作用不同,前者是先取*p的值,然后使p加1。后者先使p加1,再取*p。若p的初值为a(即2)将La并入Lb;3)将La,Lb并入Lc; (顺序表Lc中的空间是新分配的存储空间),2020/7/28,数据结构 page 54,信阳师范学院计算机与信息技术学院,顺序表的归并图示(算法2.7 b),2 3 5 6 8 8 9,0,7,7,建空表Lc,La,Lb归并,2020/7/28,数据结构 page 55,信阳师范学院计算机与信息技术学院,void MergeList_Sq(SqList La, SqList Lb, SqList /插入Lb的剩

14、余元素/MergeList_Sq,算法2.7,2020/7/28,数据结构 page 56,信阳师范学院计算机与信息技术学院,小结,顺序表的特点: 顺序存储; 随机存取; 插入删除操作要通过移动元素实现;,2020/7/28,数据结构 page 57,信阳师范学院计算机与信息技术学院,习题三 1 P17 2.11 2 编写算法: 1)判空操作 status ListEmpty_Sq(SqList L) 2)求表长操作 int ListLength_Sq(SqList L),作业,2020/7/28,数据结构 page 58,信阳师范学院计算机与信息技术学院,2.3 线性表的链式存储和实现,线性

15、表的链式存储结构是用一组任意的存储单元存储线性表的各个数据元素。为了表示线性表中元素的先后关系,每个元素除了需要存储自身的信息外还需保存直接前趋元素或直接后继元素的存储位置。,2020/7/28,数据结构 page 59,信阳师范学院计算机与信息技术学院,一 线性链表的概念,2.3.1 线性链表,用一组任意的存储单元存储线性表中的数据元素,对每个数据元素除了保存自身信息外,还保存了直接后继元素的存储位置。,用线性链表存储线性表时,数据元素之间的关系是通过保存直接后继元素的存储位置来表示的。,2020/7/28,数据结构 page 60,信阳师范学院计算机与信息技术学院,线性链表图示,用线性链表

16、存储线性表时,数据元素之间的关系是通过保存直接后继元素的存储位置来表示的,为直观起见,通常用如下所示的图表示链表,其中,箭头表示相应单元中保存的是它所指向结点的存储地址。,线性链表图示,L,2020/7/28,数据结构 page 61,信阳师范学院计算机与信息技术学院,结点:数据元素及直接后继的存储位置(地址)组成一个数据元素的存储结构,称为一个结点; 结点的数据域 :结点中用于保存数据元素的部分; 结点的指针域 :结点中用于保存数据元素直接后继存储地址的部分;,线性链表有关术语,存储数据元素,存储后继结点 存储地址,2020/7/28,数据结构 page 62,信阳师范学院计算机与信息技术学

17、院,头指针:用于存放线性链表中第一个结点的存储地址;,带头结点的线性链表图示,L是头指针,头结点,空指针,L,线性链表的每个结点中只有一个指针域 故也称为单链表,空指针:不指向任何结点,线性链表最后一个结点的指针通常是空指针;,带头结点的线性链表:第一元素结点前面增加一个附加结点的线性链表称为 带头结点的线性链表;,头结点:线性链表的第一元素结点前面的一个附加结点,称为头结点;,2020/7/28,数据结构 page 63,信阳师范学院计算机与信息技术学院,怎样在计算机上 实现线性链表?,?,可以用C语言的结构体表示线性链表的结点,用指针存放直接后继的存储地址。,2020/7/28,数据结构

18、page 64,信阳师范学院计算机与信息技术学院,typedef struct LNode ElemType data; Struct LNode *next;LNode, *LinkList;,LNode:结构类型名; LNode类型结构变量有两个域: data:用于存放线性表的数据元素, next:用于存放元素直接后继结点的地址;该类型结构变量用于表示线性链表中的一个结点;LinkList:指针类型名; LinkList类型指针变量用于存放LNode类型结构变量的地址;,Lnode类型 结构变量,LinkList类型 指针变量L,线性链表的结点类型定义及指向结点的指针类型定义,注:,202

19、0/7/28,数据结构 page 65,信阳师范学院计算机与信息技术学院,设p是指向结构体变量的指针(如Linklist类型指针), 则以下两种形式等价: (1)(*p).成员名 (2)p-成员名 如: (*p).data p-data,补充说明:,2020/7/28,数据结构 page 66,信阳师范学院计算机与信息技术学院,设L是LinkList类型变量,L用来保存线性链表中第一个结点的地址, 则L为线性链表的头指针。,线性链表基本操作的算法,如何在线性链表L 上实现线性表的基本操作? 如何建空表?插入?删除?,?,以L为头指针的线性链表称为线性链表L,2020/7/28,数据结构 pag

20、e 67,信阳师范学院计算机与信息技术学院,L,算法:Status InitList_L (LinkList / InitList_L,L = LinkList)malloc(sizeof(Lnode);,If (!L) exit(OVERFLOW);,L-next = null;,2020/7/28,数据结构 page 68,信阳师范学院计算机与信息技术学院,1)查找链表的第 i个元素结点; 2) 将第i个元素结点中的数据元素赋值给e;,ai,取元素元素操作图示,2)取元素操作,功能:将线性链表中第i 个元素赋值给 e,主要步骤:,2020/7/28,数据结构 page 69,信阳师范学院计

21、算机与信息技术学院,Status GetElem_L(LinkList L, int I, ElemType /GetElem_L 算法 2.8,取元素操作算法:,2020/7/28,数据结构 page 70,信阳师范学院计算机与信息技术学院,功能: 在线性链表L的第i个元素结点之前插入一个新元素结点;,插入前,插入后,3)插入操作,2020/7/28,数据结构 page 71,信阳师范学院计算机与信息技术学院,1)查找链表L的第 i-1个元素结点;2)为新元素建立结点;3)修改第 i-1个元素结点的指针和新元素结点指针,完成插入;,插入操作主要步骤:,2020/7/28,数据结构 page

22、72,信阳师范学院计算机与信息技术学院,Status ListInsert_L(LinkList /LinstInsert_L,插入操作算法:,2020/7/28,数据结构 page 73,信阳师范学院计算机与信息技术学院,功能:在线性链表L中删除第i个元素,并且用e 返回其值,删除前,删除后,4)删除操作,2020/7/28,数据结构 page 74,信阳师范学院计算机与信息技术学院,1)查找链表的第 i-1个元素结点;2)修改第 i-1个元素结点指针,删除第i个元素结点;3) 将第i个元素结点中的数据元素赋值给e;4)回收被删除结点空间;,删除操作主要步骤:,2020/7/28,数据结构

23、page 75,信阳师范学院计算机与信息技术学院,Status ListDelete_L(LinkList /LinstDelete_L 算法: 2.10,删除操作算法:,2020/7/28,数据结构 page 76,信阳师范学院计算机与信息技术学院,1.先建一个空表(带头结点): L=(LinkList)malloc(sizeof(LNode); L-next=NULL; 2.生成新结点: p=(LinkList)malloc(sizeof(LNode); 3.向结点中填入元素值: scanf( 6.重复2到5,直到生成n个元素结点.,头插法建立单链表步骤,2020/7/28,数据结构 pa

24、ge 77,信阳师范学院计算机与信息技术学院,void CreateList_L(LinkList /插入到表头/ /CreateList_L,头插法建立单链表算法,L,2020/7/28,数据结构 page 78,信阳师范学院计算机与信息技术学院,注:,此算法是从表尾到表头逆向建立单链表,注意循环语句FOR中i的变化范围是n到1,即第一个插入的应为an。(设线性表为(a1,a2,an))。 算法的时间复杂度为O(n)。 所建的单链表带头结点,由此也可以看出头结点的作用。(使在空表中插入一个元素与在非空表中插入一个元素一致,头指针始终不为空)。,2020/7/28,数据结构 page 79,信

25、阳师范学院计算机与信息技术学院,作业,习题三 1. P13 2.1, 2.2, 2.3, 2.14, 2.17,2.22 2. 尾插法建立单链表。,2020/7/28,数据结构 page 80,信阳师范学院计算机与信息技术学院,例:将两个有序线性链表归并成一个有序表。 设线性表A、B分别用头指针为La 、 Lb 的两个带头结点的线性链表存储,且两线性链表中元素按非递减顺序排列,编写算法,将La 、 Lb归并得到线性链表Lc, Lc中的元素也按值非递减顺序排列。(注意:线性链表Lc中的结点利用原La,Lb的结点),线性链表的其他操作,基本思想: 设两个指针pa,pb分别对La,Lb进行扫描,在扫

26、描过程中按pa,pb所指结点的大小,将其插入到Lc的表尾。,2020/7/28,数据结构 page 81,信阳师范学院计算机与信息技术学院,void MergeList_L(LinkList /释放Lb的头结点 /MergeList_L 算法 2.12,线性链表归并操作算法(直接对链表进行操作),2020/7/28,数据结构 page 82,信阳师范学院计算机与信息技术学院,线性链表归并操作图示,归并,La,2020/7/28,数据结构 page 83,信阳师范学院计算机与信息技术学院,小结,线性链表的特点 链式存储; 顺序存取; 插入删除操作通过修改结点的指针实现。,2020/7/28,数据

27、结构 page 84,信阳师范学院计算机与信息技术学院,静态链表,1 静态链表的概念 用一维数组表示的线性链表,称为静态链表。,SLinkList:数组的类型名; SLinkList类型的数组变量是结构数组,每一数组分量包括两个域: data:用于存储线性表元素; cur: 用于存储直接后继元素在数组中的位置(下标);,#define MAXSIZE 1000 / 链表的最大长度typedef struct ElemType data; int cur; component, SLinkListMAXSIZE;,2 静态链表的类型定义,2020/7/28,数据结构 page 85,信阳师范学院

28、计算机与信息技术学院,静态链表图示,数组 下标,地址,静态链表图示,2020/7/28,数据结构 page 86,信阳师范学院计算机与信息技术学院,插入前,1) 静态链表的插入,插入后,静态链表操作图示,2020/7/28,数据结构 page 87,信阳师范学院计算机与信息技术学院,2) 静态链表的删除,删除前,删除sun,删除后,2020/7/28,数据结构 page 88,信阳师范学院计算机与信息技术学院,2. 3. 2 循环链表,(a)非空表,循环链表是线性表的另一种链式存储结构,它的特点是将线性链表的最后一个结点的指针指向链表的第一个结点。,(b)空表,1 循环链表的概念,2 循环链表

29、图示,2020/7/28,数据结构 page 89,信阳师范学院计算机与信息技术学院,在解决某些实际问题时循环链表可能要比线性链表方便些。如将一个链表链在另一个链表的后面; 循环链表与线性链表操作的主要差别是算法中循环结束的条件; 对循环链表,有时不给出头指针,而是给出尾指针,设立尾指针可以很方便的找到线性表的第一个元素和最后一个元素结点,可使某些操作易于实现;例如将两个链表首尾相连的操作;,说明,2020/7/28,数据结构 page 90,信阳师范学院计算机与信息技术学院,1 双向链表的概念,2. 3. 3 双向链表,(a)结点图示,数据域,指针域,指针域,结点,存储数据元素,存储后继结点

30、 的地址,存储前趋结点 的地址,双向链表中,每个结点有两个指针域,一个指向直接后继元素结点,另一个指向直接前趋元素结点。,2020/7/28,数据结构 page 91,信阳师范学院计算机与信息技术学院,双向链表图示,(c)非空的双向循环链表,(b)空的双向循环链表,2020/7/28,数据结构 page 92,信阳师范学院计算机与信息技术学院,在双向链表中删除结点时指针变化情况,在双向链表中插入一个结点时指针的变化情况,ai-1,p,ai,双向链表的基本操作算法,p,ai-1,ai,ai+1,s,2020/7/28,数据结构 page 93,信阳师范学院计算机与信息技术学院,Status Li

31、stInsert_DuL(DuLinkList /LinstInsert_DuL 算法2.18,1)插入操作算法,2020/7/28,数据结构 page 94,信阳师范学院计算机与信息技术学院,Status ListDelete_DuL(DuLinkList /LinstDelete_DuL 算法2.19,2)删除操作算法,2020/7/28,数据结构 page 95,信阳师范学院计算机与信息技术学院,2.4 一元多项式的表示及相加,为了用计算机实现多项式运算,可用一个由系数构成的线性表来表示一元多项式: P= (p0, p1, p2 , pn) Q= (q0, q1, q2, qm) 设mn

32、 ,则两个多项式相加的结果可用线性表R表示: R= (p0+q0, p1+q1, , pm+qm, pm+1, , pn ),P n (x) = p0 + p1 x + p2 x2 + + pn xn Q m (x) = q0 + q1 x + q2 x2+ + qm xm,一、一元多项式的表示 数学上,一元多项式可按升幂写成:,2020/7/28,数据结构 page 96,信阳师范学院计算机与信息技术学院,以下用非0项(系数,指数)构成的线性表表示一元多项式。 用这种方式表示一元多项式时,一元多项式运算经常要对线性表进行插入删除操作,所以采用线性链表存储结构它们。,但应用中一元多项式往往幂次

33、很高,且有大量系数为零。 例: S (x) = 1 + 3x10000 + 2x20000 如果用系数构成的线性表表示该多项式,就要用一长度为20001的线性表表示,可表中只有三个非零项,这显然很浪费内存空间。可采用另一种方式,即用非0项(系数,指数)构成的线性表表示一元多项式, S= (1,0), (3,10000), (2,20000),2020/7/28,数据结构 page 97,信阳师范学院计算机与信息技术学院,1)元素的类型定义 typedef struct float coef ; /存储项系数int expn; /存储项指数 ElemType ;,2)一元多项式链表的类型定义 t

34、ypedef LinkList polynomail; /用带表头结点的线性链表表示多项式, /为类型重命名是为增加算法的可读性,一元多项式链式存储结构,2020/7/28,数据结构 page 98,信阳师范学院计算机与信息技术学院,3) 一元多项式链式存储结构图示,头结点,例: S (x) = 1 + 3x10000 + 2x20000,s,-1,1 0,3 10000,2 20000,2020/7/28,数据结构 page 99,信阳师范学院计算机与信息技术学院,例:求两多项式的和多项式 A (x) = 7 +3 x + 9 x 8 + 5 x 17 B (x) = 8 x + 22 x

35、7 9 x 8,C (x) = A (x) + B (x) = 7 + 11x +22 x 7 + 5 x 17,一元多项式相加运算规则:指数相同的项系数相加。,1 一元多项式的相加,一元多项式的相加算法,2020/7/28,数据结构 page 100,信阳师范学院计算机与信息技术学院,设多项式A (x) ,B (x)分别用带表头结点的线性链表Pa,Pb表示,和多项式C (x)用带表头结点的线性链表Pc表示:,如何实现用这种线性链表表示的 多项的加法运算?,2020/7/28,数据结构 page 101,信阳师范学院计算机与信息技术学院,分别对两个链表Pa 、Pb进行扫描,设qa 、qb 分别指向线性链表Pa 、 Pb的当前进行比较的某个结点,比较两个结点的指数项,有下列三种情况: (1)qa-expn expn : qa所指结点应为和多项式中的结点; (2)qa-expn = qb-expn : 将qb所指结点的系数“加”到qa所指结点的系数上相加; (3)qa-expn qb-expn : 从

温馨提示

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

评论

0/150

提交评论