数据结构第二章线性表课件.ppt
《数据结构第二章线性表课件.ppt》由会员分享,可在线阅读,更多相关《数据结构第二章线性表课件.ppt(113页珍藏版)》请在三一办公上搜索。
1、,1数据的逻辑结构,2、数据的存储结构,A线性结构,B非线性结构,A 顺序存储,B 链式存储,线性表,栈,队列,树,图,数据结构,(物理结构),数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。,逻辑结构:结构定义中的“关系”描述的是数据元素之间的逻辑关系,因此称为数据的逻辑结构。,存储结构:是数据结构在计算机中的表示(又称映像)。,前一章复习,线性结构的特点;线性表的相关概念;线性表上定义的基本运算和用基本运算构造出的较复杂的运算。,掌握顺序存储结构和链式存储结构的描述方法,以及各种基本操作的实现。,能够从时间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。,使用本章
2、所学的基本知识设计有效算法解决与线性表相关的应用问题。,本章知识点,2.1 线性表的类型定义,本章目录,2.2 线性表的顺序表示和实现,2.3 线性表的链式表示和实现,第2章 线性表,本节总结,2.4 一元多项式的表示及相加,线性结构的特点:在数据元素的非空有限集中,(1)存在唯一的一个被称为第一个的数据元素;(2)存在唯一的一个被称为最后一个的数据元素;(3)除第一个之外,集合中的每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。,第2章 线性表,线性表是一种最常用最简单的线性结构。,2.1 线性表的类型定义,线性表是n个数据元素的有限序列。,每个数据元素可
3、以是一个数或一个符号,也可是一页书,甚至更复杂的信息。如,26个英文字母的字母表(A,B,C,Z)是一个线性表,表中的数据元素是单个字母字符。又如,某校从1978年到1983年各种型号的计算机拥有量的变化情况,可用线性表的形式给出(6,17,28,50,92,188)表中的数据元素是整数。,在稍复杂的线性表中,一个数据元素可以由若干个数据项组成。这种情况下,把数据元素称为记录。含有大量记录的线性表称文件。,例如,一个学校的学生健康情况登记表,表中的每个学生的情况为一个记录,它由姓名,学号,性别,年龄,班级和健康状况等6个数据项组成.,图2.1 学生健康状况登记表,由上述例子可以看出,线性表中的
4、数据元素可以是各种各样的。但同一线性表中的元素具有相同特性,即属同一数据对象,相邻数据元素之间存在着序偶关系。,将线性表记为(a1,. ai-1,ai,ai+1.an), ai+1是ai直接后继元素, ai-1是ai直接前驱元素。当i=1,2,.,n-1时, ai有且仅有一个直接后继,当i=2,3,.,n时, ai有且仅有一个直接前驱。,线性表中的元素个数n(n0)定义为线性表的长度,n=0称为空表。 在非空表中,每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素,称i为ai在线性表中的位序。,线性表是一个相当灵活的数据结构,长度可以增长或缩短
5、,即对线性表的数据元素不仅可以进行访问,还可以进行插入和删除。,ADT List 数据对象:Dai|aiElemSet,i=1,2,.,n, n0 称n为线性表的长度;称n=0时的线性表为空表。数据关系:R1|ai-1 ,aiD, i=2,.,n 设线性表为 (a1,a2,.,ai,.,an), 称i为ai在线性表中的位序。,抽象数据类型线性表的定义,类型一:结构初始化InitList(&L) 操作结果:构造一个空的线性表L。类型二:结构销毁DestroyList(&L) 初始条件:线性表L已存在。 操作结果:销毁线性表L。类型三:引用型操作ListLength(L) 初始条件:线性表L已存在
6、。 操作结果:返回L中元素个数。,基本操作:,GetElem(L,i,&e) 初始条件:线性表L已存在, 1iListLength(L) 操作结果:用e返回L中第i个元素的值。LocateElem(L,e,compare( ) 初始条件:线性表L已存在,compare( )是元素判 定函数。 操作结果:返回L中第1个与e满足关系compare( )的元素的位序。若这样的元素不存在,则返回值为0。ListEmpty(L) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否则返回FALSE。,PriorElem(L,cur_e,&pre_e) 初始条件:线性表L已存在。 操作结果
7、:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。NextElem(L,cur_e,&next_e) 初始条件:线性表L已存在。 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败, next_e无定义。,类型四:加工型操作ListInsert(&L,i,e) 初始条件:线性表L已存在,1iListLength(L)+1 操作结果:在L的第i个位置之前插入新的元素e,L的长度增1。ListDelete(&L,i,&e) 初始条件:线性表L已存在且非空,1iListLength(L) 操作结果:删
8、除L的第i个元素,并用e返回其值,L的长度减1。ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L重置为空表。,例 2-1 假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合AAB。,利用上述定义的线性表,可以实现其它更复杂的操作,上述问题可演绎为要求对线性表作如下操作: 扩大线性表 LA,将存在于线性表LB 中而不存在于线性表 LA 中的数据元素插入到线性表 LA 中去。,1从线性表LB中依次取得每个数据元素;,2依值在线性表LA中进行查访;,3若不存在(上述函数返回0),则插入之。,GetEl
9、em(LB, i,e),LocateElem(LA, e, equal()),ListInsert(LA, +LA_len, e),操作步骤:,GetElem(Lb, i, e); /取Lb中第i个数据元素赋给eif (!LocateElem(La, e, equal( ) ) ListInsert(La, +La_len, e);/ La中不存在和 e 相同的数据元素,则插入之,void union(List / 求线性表的长度,for (i = 1; i = Lb_len; i+) , / union,时间复杂度 O(ListLength(LA)*ListLength(LB),例 2-2
10、已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。,若线性表中的数据元素相互之间可以比较,并且数据元素在线性表中依值非递减或非递增有序排列,即aiai-1或 aiai-1(i = 2,3, n),则称该线性表为有序表(Ordered List)。,非递减有序线性表举例:LA=(3,5,8,11);LB(2,6,8,9,11,15,20)LC?,void MergeList(List La, List Lb, List &Lc) / 本算法将非递减的有序表 La 和 Lb 归并为 Lc,while (i = L
11、a_len) ,InitList(Lc); / 构造空的线性表 Lci = j = 1; k = 0;La_len = ListLength(La);Lb_len = ListLength(Lb);,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 表中剩余元素 / merge_list,时间复杂度o(List
12、Length(LA)+ListLength(LB),线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。,an,.,ai,.,a2,a1,b,b+L,b+(i-1)*L,b+(n-1)*L,存储地址,内存状态,图 2.2 线性表的顺序存储结构示意图设每个元素需占L个存储单元,以所占的第一个单元的存储地址作为数据元素的存储位置。,2.2 线性表的顺序表示和实现,Loc(ai)=Loc(a1)+(i-1)*L,每个元素所占用的存储单元个数,LOC(a1)是线性表的起始地址或基地址。,线性表中第i+1个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)之
13、间满足下列关系: Loc(ai+1)=Loc(ai)+L 线性表的第i个数据元素ai的存储位置为:,线性表的这种机内表示称作线性表的顺序存储结构或顺序映象,称这种存储结构的线性表为顺序表。 以元素在计算机内的物理位置相邻来表示线性表中数据元素之间的逻辑关系。每个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。因此,只要确定了线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。,#define LIST_INIT_SIZE 100 / 线性表存储空间的初始分配量#define LISTINCREMENT 10
14、 / 线性表存储空间的分配增量typedef struct /定义一个SqList这样的类型(结构体类型)ElemType *elem; / 存储空间基址,指示线性表基地址int length; / 当前长度int listsize; / 当前分配的存储容量(以sizeof(ElemType)为单位) SqList;,/-线性表的动态分配顺序存储结构-,线性表的基本操作在顺序表中的实现,InitList_Sq(&L) / 结构初始化,LocateElem_Sq(L, e, compare() / 查找,ListInsert_Sq(&L, i, e) / 插入元素,ListDelete_Sq(&
15、L, i) / 删除元素,Status InitList_Sq( SqList / InitList_Sq,算法1:构造一个空的线性表,算法思想:检查i值是否超出所允许的范围(1in+1),若超出,则进行“超出范围”错误处理;将线性表的第i个元素和它后面的所有元素均向后移动一个位置;将新元素写入到空出的第i个位置上;使线性表的长度增1。,算法2:在线性表中指定位置前插入一个元素,插入元素时,线性表的逻辑结构由(a1, , ai-1, ai, , an)改变为(a1, , ai-1, e, ai, , an),在第i-1个数据元素和第i个数据元素之间插入新的数据元素。,(a1, , ai-1,
16、ai, , an) 改变为 (a1, , ai-1, e, ai, , an), ,表的长度增加,图2.3 线性表插入前后的状况(a)插入前n=8; (b)插入后n=9,插入25,Status ListInsert_Sq(SqList ,在线性表中指定位置前插入一个元素,if (!newbase) exit(OVERFLOW); / 存储分配失败L.elem = newbase; / 新基址L.listsize += LISTINCREMENT; / 增加存储容量q = /ListInsert_Sq,realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩大或是缩小,原有内存中的内容
17、将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。 realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc返回的指针很可能指向一个新的地址。所以,在代码中,我们必须将realloc返回的值,重新赋值给p。,例如:ListInsert_Sq(L, 5, 66),L.length-1,0,87,56,42,66,q = ,一般情况下,在第i(1in)个元素之前插入一个元素时,需将第n至第i(共n-i+1个)元素向后移动一个位置。Pi是在第i个数据元素之前插入一个元素的概率。 在长度为n的线性表中插入一个元素时所需移动元素次数的期望值(平均次数)为,
18、插入时移动次数的期望值(平均次数),算法思想:检查i值是否超出所允许的范围(1in),若超出,则进行“超出范围”错误处理;将线性表的第i个元素后面的所有元素均向前移动一个位置;使线性表的长度减1。,算法3:在线性表中删除第i个元素,删除元素时,线性表的逻辑结构由(a1, , ai-1, ai, ai+1, , an)改变为(a1, , ai-1, ai+1, , an)。,(a1, , ai-1, ai, ai+1, , an) 改变为 (a1, , ai-1, ai+1, , an),ai+1,an, ,表的长度减少,图2.4 线性表删除前后的情况(a)删除前n=8; (b)删除后n=7,删
19、除24,Status ListDelete_Sq(SqList / 删除位置不合法,在顺序线性表L中删除第i个元素,p =/ListDelete_Sq,L.length-1,0,87,56,p = ,例如:ListDelete_Sq(L, 5, e),一般情况下,删除第i(1in)个元素时,需将第i+1至第n(共n-i个)元素依次向前移动一个位置。qi是删除第i个元素的概率。 在长度为n的线性表中删除一个元素时所需移动元素次数的期望值(平均值)为,删除第i个元素的移动次数的期望值(平均值),例如:顺序表,23 75 41 38 54 62 17,L.length,L.listsize,e =,
20、38,i,1,2,3,4,1,8,50,可见,基本操作是:将顺序表中的元素逐个和给定值 e 相比较。,算法4:在顺序表中查找是否存在和e相同的数据元素,int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType) / 在顺序表中查询第一个满足判定条件的数据元素, / 若存在,则返回它的位序,否则返回 0i = 1; / i 的初值为第 1 元素的位序p = L.elem; / p 的初值为第 1 元素的存储位置while (i = L.length / LocateElem_Sq,算法思想:分别从LA
21、和LB中取得当前元素ai和bj;若aibj,则将ai插入到LC中,否则将bj插入到LC中。,算法5:线性表合并,已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,求得线性表LC中的数据元素仍按值非递减有序排列。设 LA=(a1,ai,an),LB=(b1,bj,bm)。LC=(c1,ck,cm+n),void MergeList_Sq(SqList La,SqList Lb,SqList /存储分配失败,接下页,a_last=La.elem+La.length-1;pb_last=Lb.elem+Lb.length-1;while(pa=pa_la
22、st /插入Lb的剩余元素/MergeList_Sq,作业: 设顺序表va中的数据元素递增有序,试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。顺序表结构的定义遵从教材P22“线性表动态分配存储结构”,2.3 线性表的链式表示和实现,线性表的链式存储结构特点:用一组任意的存储单元(可以是连续的,也可以是不连续的)存放线性表的数据元素。,为了表示每个数据元素与其直接后继之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映象,称为结点。它含有两个域:存储数据元素信息的域称为数据域。
23、存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。,数据域 指针域,结点,2.3.1 线性链表,n个结点链成一个链表,即为线性表(a1,a2,an)的链式存储结构。由于链表的每个结点中只包含一个指针域,又称线性链表或单链表。 整个链表的存取需从头指针开始进行,头指针指示链表中第一个结点(即第一个数据元素的存储映象)的存储位置。由于最后一个数据元素没有直接后继,则线性表中最后一个结点的指针为空(NULL)。 指针为数据之间逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,这种存储结构为非顺序映像或链式映像。,typedef struct LNode Elem
24、Type data; struct Lnode *next; LNode,*LinkList;,线性表的单链表存储结构,假设p是指向第i个元素ai的指针,则pnext是指向第i+1个数据元素ai+1的指针。若pdata= ai则 p next data= ai+1,下图为(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG)线性表的线性链表存储结构,存储从头指针开始进行。,43,13,1,NULL,37,7,19,25,图2.6 线性链表的逻辑状态,图2.5 线性链表示例,头指针,空指针,图2.7 带头结点的单链表,L,(a)非空表,(b)空表,在单链表的第一个结点之前附设
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第二 线性 课件

链接地址:https://www.31ppt.com/p-1787946.html