数据结构第二章.pptx
《数据结构第二章.pptx》由会员分享,可在线阅读,更多相关《数据结构第二章.pptx(103页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.线性表的语言定义线性表是n个数据元素的有限序列。例,英文字母表(A,B,C,Z)线性表中的数据元素可以由若干个数据项组成。例,包含大量记录的登记表姓名姓名学号学号性别性别年龄年龄班级班级王晓林王晓林790631男男25计计90陈红陈红790632女女24计计902.1 线性表的定义第1页/共103页2.线性表的形式定义其中a1是头元素,an是尾元素,ai是第i个元素。ai-1是ai的直接前驱,ai是ai-1的直接后继。当2in时,ai有且只有一个直接前驱。当1in-1时,ai有且只有一个直接后继。线性表可以表示为n个数据元素的有限序列:(a1,ai-1,ai,an)第2页/共103页抽象数
2、据类型线性表List的定义:InitList(&L)结果:构造一个空的线性表L。数据对象:D=ai|aiElemSet,i=1,2,n数据关系:R1=基本操作:ADTListADTListDestroyList(&L)结果:销毁线性表L。条件:线性表L已存在。ClearList(&L)结果:将L重置为空表。条件:线性表L已存在。第3页/共103页主要基本操作包括:ListLength(L)条件:线性表L已存在结果返回L数据元素个数GetElem(L,i,&e)LocateElem(L,e,compare()PriorElem(L,cur_e,&pre_e)NextElem(L,cur_e,&n
3、ext_e)ListInsert(&L,i,e)ListEmpty(L)条件:线性表L已存在结果:若L为空表,则返回TRUE否则返回FALSEListdelete(&L,i,e)ListTraverse(L,visit()第4页/共103页一些复杂操作,如合并、拆分、复制等等均可以通过上述简单操作实现。第5页/共103页算法2.1,两个线性表La,Lb的合并。要求:扩展线性表La,将存在于Lb中而不存在于La中的数据元素插入到La中。思想:1.依次取出Lb中的数据元素进行处理2.判断该数据元素是否存在于La中3.在则取下一个数据元素,否则插入到La中第6页/共103页La_len=ListLe
4、ngth(La);Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i+)GetElem(Lb,i,e);if(!LocateElem(La,e,equal)ListInsert(La,+La_len,e);voidunion(List&La,ListLb)注意基本操作的执行时间特别是LocateElem!第7页/共103页例,La=(3,13,7,9)Lb=(5,7,10)首先,La_len=4;Lb_len=3;31379La5710Lb5查找La,未找到查找La,找到查找La,未找到10第8页/共103页算法2.2,两个有序线性表La,Lb的合并。要求:线性表
5、La、Lb中的数据元素按值非递减有序排列,合并La、Lb构造Lc,使Lc中的数据元素仍按值非递减有序排列。例,La=(3,5,8,11)Lb=(2,6,8,9,11,15,20)构造Lc=(2,3,5,6,8,8,9,11,11,15,20)ij构造Lc=(2,3,5,6,8,8,9,11,11,15,20)ji构造Lc=(2,3,5,6,8,8,9,11,11,15,20)ij构造Lc=(2,3,5,6,8,8,9,11,11,15,20)思想:第9页/共103页La_len=ListLength(La);Lb_len=ListLength(Lb);voidMergeList(ListLa,
6、ListLb,List&Lc)InitList(Lc);i=j=1;k=0;GetElem(La,i,a);GetElem(Lb,j,b);while(i=La_len)&(j=Lb_len)if(a=b)ListInsert(Lc,+k,a);+i;elseListInsert(Lc,+k,b);+j;/处理超长部分第10页/共103页GetElem(La,i+,a);ListInsert(Lc,+k,a);/如果剩余Lawhile(ilcGetElem(Lb,j+,b);ListInsert(Lc,+k,b);/如果剩余Lbwhile(jlc/处理超长部分第11页/共103页例,La=(3
7、,5,8)Lb=(2,6,8,9,15)构造Lc=(2,3,5,6,8,8,9,15)358La268Lb915Lcij2首先,La_len=3;Lb_len=5;3ijij5ij6ij88jij9j15j算法结束!第12页/共103页算法时间复杂度算法2.1算法2.2O(ListLength(La)ListLength(Lb)O(ListLength(La)+ListLength(Lb)前提:GetElem()和ListInsert()的执行时间与表长无关LocateElem()的执行时间与表长成正比第13页/共103页IntlocateElem_Sq(SqListL,ElemTypee,s
8、tatus(*compare)(ElemType,ElemType)i=1;p=L.elem/第一个元素的存储地址while(iL.length&!(*compare)(*p+,e)+iif(i=L.length)returni;Elsereturn0;*compare为指向函数的指针:即定义了一个指向函数的指针变量compare,此处该指针变量指向的函数带有两个参数ElemType,ElemType,返回status类型值。Statuscompare(ElemTypex,ElemTypey)returnx=y;第14页/共103页 LocateElem 函数也可以这样写:int Locate
9、Elem(SqList L,ElemType e)Status compare(ElemType,ElemType);ElemType*p;int i=1;p=L.elem;while(i=L.length&!compare(*p+,e)i+;if(i=q;-p)*(p+1)=*p;/后移元素L.listsize第24页/共103页if(iL.length+1)returnERROR;if(L.length=L.listsize)/越界处理;q=&(L.elemi-1);/q为插入位置(位序)for(p=&L.elemL.length-1;p=q;-p)*(p+1)=*p;/后移元素*q=e;
10、/插入新元素+L.length;returnOK;StatusListInsert_Sq(Sqlist&L,inti,ElemTypee)定义一的插入算法第25页/共103页if(iL.length+1)returnERROR;if(L.length=maxsize)/越界处理;for(j=L.length-1;j=i-1;j-)L.dataj+1=L.dataj;L.datai-1=x;L.length+;returnOK;voidListInsert_Sq(Sqlist&L,inti,ElemTypee)定义二的插入算法第26页/共103页/越界处理newbase=(ElemType*)r
11、ealloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;if(L.length=L.listsize)第27页/共103页例,在第4个元素之前插入元素25。451293369512345657693325插入25第28页/共103页算法时间复杂度:时间主要花在移动元素上,而移动元素的个数取决于插入元素位置。i=1,需移动n个元素;i=i,需移动ni+1个元素;i=n+1,需移动0个元素;第29页/共1
12、03页假设pi是在第i个元素之前插入一个新元素的概率则长度为n的线性表中插入一个元素所需移动元素次数的期望值为:Eis=pi(ni+1)n+1i=1设在任何位置插入元素等概率,pi=n+11Eis=(ni+1)=n+11i=1n+12nO(n)第30页/共103页算法2.5删除第i个数据元素思想:a1ai-1ai+1ana1ai-1ai+1anai1.删除第i个数据元素。2.将第i+1到n个元素均向前移动一个位置。第31页/共103页if(iL.length)returnERROR;p=&(L.elemi-1);for(+p;p=q;+p)*(p-1)=*p;/前移e=*p;/取第i个元素的值
13、q=L.elemL.length1;取最后一个元素的地址returnOK;StatusListDelete_Sq(Sqlist&L,inti,ElemType&e)-L.length;删除算法(定义一)/取第i个元素的地址第32页/共103页if(iL.length)returnERROR;for(j=i;jl.length-1;j+)L.dataj-1=L.dataj;/前移VoidListDelete_Sq(Sqlist&L,inti,ElemType&e)L.length-;删除算法(定义二)e=L.datai;第33页/共103页算法时间复杂度:时间主要花在移动元素上,而移动元素的个数
14、取决于删除元素位置。i=1,需移动n-1个元素;i=i,需移动ni个元素;i=n,需移动0个元素;第34页/共103页例,删除第4个元素25。删除25451292533691234567533695第35页/共103页假设qi是删除第i个元素的概率则长度为n的线性表中删除一个元素所需移动元素次数的期望值为:Edl=qi(ni)ni=1设删除任何位置的元素等概率,qi=n1Edl=(ni)=n1i=1n2n-1O(n)故在顺序表中插入或删除一个元素时,平均移动表的一半元素,当n很大时,效率很低。第36页/共103页voidMergeList_sq(SqListLa,SqListLb,SqList
15、&Lc)pa=La.elem;pb=Lb.elem;/ElemType*pa,*pb,*pc,*pa_last,*pb_last;Lc.listsize=Lc.length=La.length+Lb.length;pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType);if(!Lc.elem)exit(OVERFLOW);pa_last=La.elem+La.length-1;pb_last=Lb.elem+Lb.length-1;while(pa=pa_last&pb=pb_last)if(*pa=*pb)*pc+=*pa+;els
16、e*pc+=*pb+;while(pa=pa_last)*pc+=*pa+;while(pbnext=NULL第47页/共103页线性表的单链表结点表示a1a2a3aianL不带头结点的链表a1=L-data;Sa2=L-next-data;S=L-next;用S如何表示a2,a3呢?第48页/共103页 a1a2a3aianL带头结点的链表结点表示a1=L-next-data SS=L-next-next第49页/共103页线性表的链式存储结构的特点不可随机存取表中任意数据元素缺点:不可直接获取线性表的长度优点?数据元素的插入、删除相对顺序表的操作方便。第50页/共103页例:取线性单链表第
17、i个元素。a1a2aiLPP=P-nextji在链表中,即使知道被访问结点的序号i,也不能象顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。第51页/共103页算法2.8:取线性单链表第i个元素。p=L-next;j=1;/初始化,p指向首元结点while(p&jnext;+j;if(!p|ji)returnERROR;e=p-data;returnOK;StatusGetElem_L(LinkListL,inti,ElemType&e)a1a2aiLPP-nextji第52页/共103页例,取第i=3个元素。ZhaoQia
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第二
限制150内