数据结构二单元作业及课件.ppt
《数据结构二单元作业及课件.ppt》由会员分享,可在线阅读,更多相关《数据结构二单元作业及课件.ppt(81页珍藏版)》请在沃文网上搜索。
1、第二章第二章线性表线性表教学重点与难点重点:重点:u顺序表与链表类的描述方法;顺序表与链表类的描述方法;u在两种存储结构上实现线性表的基在两种存储结构上实现线性表的基 本操作的算法。本操作的算法。难点:难点:u线性表在两种存储结构上的插入、删除线性表在两种存储结构上的插入、删除算法及动态链表的创建算法。算法及动态链表的创建算法。课前思考课前思考u按数据元素之间的逻辑关系不同,数按数据元素之间的逻辑关系不同,数 据结构有哪几类?据结构有哪几类?u你能举出几个你熟悉的你能举出几个你熟悉的“序列序列”的例子的例子来来 吗?吗?线性结构、树型结构、图型结构和线性结构、树型结构、图型结构和集合四类。集合
2、四类。如:如:00,1 1,2 2,9 9“A A,B B,C C,ZZ。?线性结构的线性结构的基本特征基本特征为为:1集合中必存在唯一的一个集合中必存在唯一的一个“第一元素第一元素”;2集合中必存在唯一的一个集合中必存在唯一的一个“最后元素最后元素”;3除最后元素在外,均有除最后元素在外,均有唯一的后继唯一的后继;4除第一元素之外,均有除第一元素之外,均有唯一的前驱唯一的前驱。线性结构线性结构 是是 一个数据元素的一个数据元素的有序(次序)集有序(次序)集线性表线性表是一种最简单的线性结构线性结构2.1 线性表的类型定义线性表的类型定义2.3线性表类型的实现线性表类型的实现链式映象链式映象2
3、.4一元多项式的表示一元多项式的表示2.2线性表类型的实现线性表类型的实现顺序映象顺序映象l线性表定义:一个线性表是线性表定义:一个线性表是n个数据元素的有限序列个数据元素的有限序列例例英文字母表(英文字母表(A,B,C,.Z)是一个线性表是一个线性表例例数据元素数据元素抽象数据类型线性表线性表的定义如下:ADTList 数据对象数据对象:D ai|ai ElemSet,i=1,2,.,n,n0 称 n 为线性表的表长表长;称 n=0 时的线性表为空表空表数据关系数据关系:R1|ai-1,aiD,i=2,.,n 设线性表为(a1,a2,.,ai,.,an),称i为ai 在线性表中的位序位序 基
4、本操作:基本操作:结构初始化操作结构初始化操作结构销毁操作结构销毁操作引用型操作引用型操作 加工型操作加工型操作 ADT List2.1线性表的类型定义线性表的类型定义 InitList(&L)操作结果:操作结果:构造一个空的线性表L。初始化操作初始化操作结构销毁操作结构销毁操作DestroyList(&L)初始条件:操作结果:线性表 L 已存在。销毁线性表 L。ListEmpty(L)ListLength(L)PriorElem(L,cur_e,&pre_e)NextElem(L,cur_e,&next_e)GetElem(L,i,&e)LocateElem(L,e,compare()Lis
5、tTraverse(L,visit()引用型操作引用型操作:ListEmpty(L)(线性表判空)(求数据元素的前驱)pre_e 返回它的前驱pre_e 返回它的后继用 e 返回L中第 i 个元素的值返回L中第中第1个个与e满足满足关系compare()的元素的位序。若不存在,则返回值为0。遍历判断是否为空加工型操作加工型操作 ClearList(&L)PutElem(&L,i,&e)ListInsert(&L,i,e)ListDelete(&L,i,&e)将L重置为空表。L中第i个元素赋值同e的值。在L的第i个元素之前插入插入新的元素e,L的长度增1。删除L的第i个元素,并用e返回其值,L的
6、长度减1。算法实现:算法实现:voidunion(List&La,ListLb)/将所有在线性表将所有在线性表Lb中但不在中但不在La中的数据元素插入到中的数据元素插入到La中中La_len=ListLength(La);Lb_len=ListLength(Lb);/求线性表的长度求线性表的长度for(i=1;i=Lb_len;i+)GetElem(Lb,i,e);/取取Lb中第中第i个数据元素赋给个数据元素赋给eif(!LocateElem(La,e,equal()ListInsert(La,+La_len,e);/La中不存在和中不存在和e相相同的数据元素,则插入之同的数据元素,则插入之求
7、集合求集合A与与B的并集的并集巳知线性表巳知线性表LALA和线性表和线性表LBLB中的数据元素按值非递减中的数据元素按值非递减有序排列,现要求将有序排列,现要求将LALA和和LBLB归并为一个新的线性表归并为一个新的线性表LCLC,且,且LCLC中的元素仍按值非递减有序排列。中的元素仍按值非递减有序排列。求解:设两个指针:i指向LA中的元素a,j指向LB中的元素b。LC中的元素c=a(ab)。此问题的算法如下:例例2-2void MergeList(List La,List Lb,List&Lc)/本算法将非递减的有序表 La 和 Lb 归并为 Lc/merge_listwhile(i=La_
8、len)&(j=Lb_len)/La和和Lb均不空均不空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表中剩余元素表中剩余元素GetElem(La,i,ai);GetElem(Lb,j,b
9、j);if(ai=bj)ListInsert(Lc,+k,ai);+i;elseListInsert(Lc,+k,bj);+j;用一组地址连续地址连续的存储单元依次存放依次存放线性表中的数据元素 a1 a2 ai-1 ai an线性表的起始地址线性表的起始地址称作线性表的基地址称作线性表的基地址以“存储位置相邻存储位置相邻”表示有序对 即:LOC(ai)=LOC(ai-1)+C 一个数据元素所占存储量一个数据元素所占存储量所有数据元素的存储位置均取决于所有数据元素的存储位置均取决于第一个数据元素的存第一个数据元素的存储位置储位置 LOC(ai)=LOC(a1)+(i-1)C 基地址基地址顺序映
10、像的顺序映像的C语言描述语言描述typedefstruct SqList;/俗称 顺序表顺序表#define LIST_INIT_SIZE 80 /线性表存储空间的初始分配量#define LISTINCREMENT 10 /线性表存储空间的分配增量ElemType *elem;/存储空间基址int length;/当前长度int listsize;/当前分配的存储容量 /(以sizeof(ElemType)为单位)elemlengthlistsizeSeqListElemType线性表的基本操作在顺序表中的实现线性表的基本操作在顺序表中的实现InitList(&L)/结构初始化结构初始化Lo
11、cateElem(L,e,compare()/查找查找ListInsert(&L,i,e)/插入元素插入元素ListDelete(&L,i)/删除元素删除元素Status InitList_Sq(SqList&L)/构造一个空的线性表/InitList_Sq算法时间复杂度时间复杂度:O(1)L.elem=(ElemType*)malloc(LIST_INIT_SIZE sizeof(ElemType);if(!L.elem)exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZEreturn OK;#defineLIST_INT_SIZE100#d
12、efineLISTINCREAMENT10typedefstructElemType*elem;/*线性表占用的数组空间。线性表占用的数组空间。*/intlength;/*线性表的长度线性表的长度*/intlistsize;/*当前分配的存储容量当前分配的存储容量(以以sizeof(ElemType)为单位为单位)/*SeqList;例如:顺序表 23754138546217L.elemL.lengthL.listsizee=38pppppi 1 2 3 4 1 850p可见,基本操作是:将顺序表中的元素逐个和给定值 e 相比较。intLocateElem_Sq(SqListL,ElemTyp
13、ee,Status(*compare)(ElemType,ElemType)/在顺序表中查询第一个满足判定条件的数据元素,/若存在,则返回它的位序,否则返回 0/LocateElem_Sq O(ListLength(L)算法的算法的时间复杂度时间复杂度为:为:i=1;/i i 的初值为第的初值为第 1 1 元素的位序元素的位序p=L.elem;/p p 的初值为第的初值为第 1 1 元素的存储位置元素的存储位置while(i=L.length&!(*compare)(*p+,e)+i;if(i=L.listsize)/当前存储空间已满,增加分配newbase=(ElemType*)reallo
14、c(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)exit(OVERFLOW);/存储分配失败 L.elem=newbase;/新基址 L.listsize+=LISTINCREMENT;/增加存储容量if(i L.length+1)return ERROR;/插入位置不合法 q=&(L.elemi-1);/q 指示插入位置for(p=&(L.elemL.length-1);p=q;-p)*(p+1)=*p;/插入位置及之后的元素右移元素右移*q=e;/插入e+L.length;/表长增1returnOK;/Lis
15、tInsert_Sq算法时间复杂度为算法时间复杂度为:O(ListLength(L)考虑移动元素的平均情况考虑移动元素的平均情况:假设在第 i 个元素之前插入的概率为 ,则在长度为n 的线性表中插入一个元素所需插入一个元素所需移动元素次数的期望值移动元素次数的期望值为:若假定假定在线性表中任何一个位置上进行插入插入的概率的概率都是相等相等的,则移动元素的期望值移动元素的期望值为:实现步骤:实现步骤:将第将第i+1至第至第n位的元素向前移动一个位置;位的元素向前移动一个位置;表长减表长减1。注意注意:事先需要判断,事先需要判断,删除位置删除位置i是否合法是否合法?3)3)删除删除 删除删除线性表
16、的第线性表的第i i个位置上的元素个位置上的元素 使:长度为n的线性表变为长度为n-1的线性表。(a1,a2,ai-1,ai,ai+1,an)(a1,a2,ai-1,ai+1,an)顺序表删除的演示顺序表删除的演示Status ListDelete_Sq(SqList&L,int i,ElemType&e)/ListDelete_Sqfor(+p;p=q;+p)*(p-1)=*p;/元素左元素左移移-L.length;/表长减表长减1 1return OK;算法时间复杂度算法时间复杂度为为:O(ListLength(L)p=&(L.elemi-1);/p 为被删除元素的位置为被删除元素的位置e
17、=*p;/被删除元素的值赋给被删除元素的值赋给eq=L.elem+L.length-1;/表尾元素的位置表尾元素的位置if(i L.length)return ERROR;/删除位置不合法删除位置不合法考虑移动元素的平均情况考虑移动元素的平均情况:假设删除第 i 个元素的概率为 ,则在长度为n 的线性表中删除一个元素所需移动元素次数的期望值移动元素次数的期望值为:若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值移动元素的期望值为:小结小结线性表线性表顺序存储结构特点顺序存储结构特点:逻辑关系上相邻的:逻辑关系上相邻的两个元素在物理存储位置上也相邻;两个元素在物理存储位
18、置上也相邻;优点:优点:可以随机存取表中任一元素可以随机存取表中任一元素O(1);存储存储空间使用紧凑空间使用紧凑缺点:缺点:在插入,删除某一元素时,需要移动大在插入,删除某一元素时,需要移动大量元素量元素O(n);预先分配空间需按最大空预先分配空间需按最大空间分配,利用不充分间分配,利用不充分;表容量难以扩充表容量难以扩充为克服这一缺点,我们引入另一种存储形式:为克服这一缺点,我们引入另一种存储形式:链式存储结构链式存储结构见见2.3节节链表的表示链表的表示特点:用一组任意的存储单元存储线性表的数据元素利用指针实现了用不相邻的存储单元存放逻辑上相邻的元素每个数据元素ai,除存储本身信息外,还
19、需存储其直接后继的信息结点数据域:元素本身信息指针域:指示直接后继的存储位置数据域 指针域结点头结点头结点 a1 a2 .an 头指针头指针空指针线性表为空表时,头结点的指针域为空 头指针头指针是指向链表中第一个结点(或为是指向链表中第一个结点(或为头结点头结点或或为首元为首元结点结点)的指针。)的指针。单链表可由一个头指针唯一确定单链表可由一个头指针唯一确定。头结点头结点是在链表的是在链表的首元结点首元结点之前之前附设附设的一个结点;数据的一个结点;数据域内只放空表标志和表长等信息域内只放空表标志和表长等信息;首元结点首元结点是指链表中存储线性表第一个数据元素是指链表中存储线性表第一个数据元
20、素a1的结的结点。点。一个线性表的逻辑结构为:一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANGZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),),其存其存储结构用单链表表示如下,储结构用单链表表示如下,请问其请问其头指针头指针的的值值是多少是多少?存储地址存储地址数据域数据域指针域指针域1LI437QIAN1313SUN119WANGNULL25WU3731ZHAO737ZHENG1943ZHOU25例例:答:答:头指针头指针是指向是指向链表中第一个结点链表中第一个结点的指针,因此关键的指针,因此关键是要寻找是要寻找第一
21、个结第一个结点点的的地址地址。7ZHAOH31头指针的值是头指针的值是31上例链表的逻辑结构示意图有以下上例链表的逻辑结构示意图有以下两种形式两种形式:ZHAOQIANLISUNZHOUWUZHENG/WANGHZHAOQIANLISUNZHOUWUZHENG/WANGH区别:区别:无头结点无头结点有头结点有头结点答:答:讨论1.在链表中设置头结点有什么好处?讨论2.如何表示空表空表?头结点头结点即在链表的首元结点之前附设的一个结点,该结即在链表的首元结点之前附设的一个结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作
22、时,可以对进行操作时,可以对空表、非空表空表、非空表的情况以及对的情况以及对首元结点首元结点进行进行统一处理,编程更方便。统一处理,编程更方便。答:答:无头结点时,无头结点时,当头指针的值为空当头指针的值为空时表示空表;时表示空表;有头结点时,有头结点时,当头结点的指针域为空当头结点的指针域为空时表示空表。时表示空表。头指针头指针头指针头指针头头结点结点无头结点无头结点有头结点有头结点二、结点和单链表的二、结点和单链表的 C语言描述语言描述typedefstructLnodeElemTypedata;/数据域structLnode*next;/指针域Lnode,*LinkList;/*Link
23、List为Lnode类型的指针介绍三个有用的库函数(都在介绍三个有用的库函数(都在中):中):sizeof(x)计算变量计算变量x的长度;的长度;malloc(m)开辟开辟m字节长度的地址空间,并返字节长度的地址空间,并返回这段空间的首地址;回这段空间的首地址;free(p)释放指针释放指针p所指变量的存储空间,所指变量的存储空间,即彻底删除一个变量。即彻底删除一个变量。三、单链表操作的实现三、单链表操作的实现GetElem(L,i,e)/取第取第i i个数据元素个数据元素ListInsert(&L,i,e)/插入插入数据元素数据元素ListDelete(&L,i,e)/删除删除数据元素数据元
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 单元 作业 课件