数据结构线性表PPT.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构线性表PPT.ppt》由会员分享,可在线阅读,更多相关《数据结构线性表PPT.ppt(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2 2章章 线性表线性表 2.1 2.1 线性表的基本概念线性表的基本概念 2.2 2.2 线性表的顺序存储线性表的顺序存储2.3 2.3 线性表的链式存储线性表的链式存储2.4 2.4 线性表的应用线性表的应用 本章小结本章小结 2.5 2.5 有序表有序表 2.1 2.1 线性表的基本概念线性表的基本概念 2.1.1 线性表的定义线性表的定义2.1.2 线性表的运算线性表的运算2.1.1 2.1.1 线性表的定义线性表的定义 线性表是具有相同特性的数据元素的一个有线性表是具有相同特性的数据元素的一个有限序列。限序列。该序列中所含元素的个数叫做线性表的该序列中所含元素的个数叫做线性表的长
2、度长度,用用n表示表示,n0。当当n=0时时,表示线性表是一个空表表示线性表是一个空表,即表中不包即表中不包含任何元素。设序列中第含任何元素。设序列中第i(i表示位序表示位序)个元素为个元素为ai(1in)。线性表的一般表示为线性表的一般表示为:(a1,a2,ai,ai+1,an)其其中中a1为为第第一一个个元元素素,又又称称做做表表头头元元素素,a2为为第第二二个个元元素素,an为为最最后后一一个个元元素素,又又称称做做表表尾尾元元素。素。例如例如,在线性表在线性表 (1,4,3,2,8,10)中中,1为表头元素为表头元素,10为表尾元素。为表尾元素。2.1.2 2.1.2 线性表的运算线性
3、表的运算 线性表的基本运算如下线性表的基本运算如下:(1)初初始始化化线线性性表表InitList(&L):构构造造一一个个空空的的线线性性表表L。(2)销销毁毁线线性性表表DestroyList(&L):释释放放线线性性表表L占占用用的内存空间。的内存空间。(3)判判线线性性表表是是否否为为空空表表ListEmpty(L):若若L为为空空表表,则返回真则返回真,否则返回假。否则返回假。(4)求求线线性性表表的的长长度度ListLength(L):返返回回L中中元元素素个数。个数。(5)输输出出线线性性表表DispList(L):当当线线性性表表L不不为为空空时时,顺序显示顺序显示L中各结点的
4、值域。中各结点的值域。(6)求求线线性性表表L中中指指定定位位置置的的某某个个数数据据元元素素GetElem(L,i,&e):用用e返返回回L中中第第 i(1iListLength(L)个元素的值。个元素的值。(7)定定位位查查找找LocateElem(L,e):返返回回L中中第第1个个值值域域与与e相等的位序。若这样的元素不存在相等的位序。若这样的元素不存在,则返回值为则返回值为0。(8)插插入入数数据据元元素素ListInsert(&L,i,e):在在L的的第第i(1iListLength(L)+1)个个元元素素之之前前插插入入新新的的元元素素e,L的长度增的长度增1。(9)删除数据元素删
5、除数据元素ListDelete(&L,i,&e):删除删除L的第的第i(1iListLength(L)个元素个元素,并用并用e返回其值返回其值,L的长的长度减度减1。例例2.1 假假设设有有两两个个集集合合 A 和和 B 分分别别用用两两个个线线性性表表 LA 和和 LB 表表示示,即即线线性性表表中中的的数数据据元元素素即即为为集集合合中中的的成成员员。编编写写一一个个算算法法求求一一个个新新的的集集合合C=AB,即将两个集合的并集放在线性表即将两个集合的并集放在线性表LC中。中。解解:本算法思想是本算法思想是:先初始化线性表先初始化线性表LC,将将LA的的所有元素复制到所有元素复制到LC中
6、中,然后扫描线性表然后扫描线性表LB,若若LB的的当前元素不在线性表当前元素不在线性表LA中中,则将其插入到则将其插入到LC中。算中。算法如下法如下:void unionList(List LA,List LB,List&LC)int lena,lenc,i;ElemType e;InitList(LC);for(i=1;i=ListLength(LA);i+)/*将将LA的所有元素插入到的所有元素插入到Lc中中*/GetElem(LA,i,e);ListInsert(LC,i,e);lena=ListLength(LA);/*求线性表的长度求线性表的长度*/lenB=ListLength(L
7、B);for(i=1;i=lenb;i+)GetElem(LB,i,e);/*取取LB中第中第i个数据元素赋给个数据元素赋给e*/if (!LocateElem(LA,e)ListInsert(LC,+lenc,e);/*LA中不存在和中不存在和e相同者相同者,则插入到则插入到LC中中*/由由 于于 LocateElem(LA,e)运运 算算 的的 时时 间间 复复 杂杂 度度 为为O(ListLength(LA),所以本算法的时间复杂度为所以本算法的时间复杂度为:O(ListLength(LA)*ListLength(LB)。2.2 2.2 线性表的顺序存储线性表的顺序存储2.2.1 线性表
8、的顺序存储线性表的顺序存储顺序表顺序表2.2.2 顺序表基本运算的实现顺序表基本运算的实现2.2.1 2.2.1 线性表的顺序存储线性表的顺序存储顺序表顺序表 线性表的顺序存储结构就是线性表的顺序存储结构就是:把线性表中的所把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。器中指定存储位置开始的一块连续的存储空间中。这样这样,线性表中第一个元素的存储位置就是指线性表中第一个元素的存储位置就是指定的存储位置定的存储位置,第第i+1个元素个元素(1in-1)的存储的存储位置紧接在第位置紧接在第i i个元素的
9、存储位置的后面。个元素的存储位置的后面。线性表线性表 逻辑结构逻辑结构顺序顺序表表 存储结构存储结构 假定线性表的元素类型为假定线性表的元素类型为ElemType,则每个元则每个元素所占用存储空间大小素所占用存储空间大小(即字节数即字节数)为为sizeof(ElemType),整个线性表所占用存储空间的大小整个线性表所占用存储空间的大小为为:n*sizeof(ElemType)其中其中,n表示线性表的长度。表示线性表的长度。顺序表示意图顺序表示意图 在在定定义义一一个个线线性性表表的的顺顺序序存存储储类类型型时时,需需要要定定义义一一个个数数组组来来存存储储线线线线表表中中的的所所有有元元素素
10、和和定定义义一一个个整整型变量来存储线性表的长度。型变量来存储线性表的长度。假假定定数数组组用用dataMaxSize表表示示,长长度度整整型型变变量量用用length表表示示,并并采采用用结结构构体体类类型型表表示示,则则元元素素类类型型为为通通用用类类型型标标识识符符ElemType的的线线性性表表的的顺顺序序存存储储类类型型可可描述如下描述如下:typedef struct ElemType dataMaxSize;int length;SqList;/*/*顺序表类型顺序表类型*/*/其中其中,data成员存放元素成员存放元素,length成员存放线性表成员存放线性表的实际长度。的实际
11、长度。说明:由于说明:由于C/C+C/C+中数组的下标从中数组的下标从0 0开始,线性表的第开始,线性表的第i i个元素个元素a ai i存放顺序表的第存放顺序表的第i-1i-1位置上。为了清楚,将位置上。为了清楚,将a ai i在逻辑在逻辑序列中的位置称为序列中的位置称为逻辑位序逻辑位序,在顺序表中的位置称为,在顺序表中的位置称为物理位物理位序序。2.2.2 2.2.2 顺序表基本运算的实现顺序表基本运算的实现 一旦采用顺序表存储结构一旦采用顺序表存储结构,我们就可以用我们就可以用C/C+语言实现线性表的各种基本运算。为了方语言实现线性表的各种基本运算。为了方便便,假设假设ElemType为
12、为char类型类型,使用如下自定义类使用如下自定义类型语句型语句:typedef char ElemType;1.建立顺序表建立顺序表其方法是将给定的含有其方法是将给定的含有n个元素的数组的每个元素的数组的每个元素依次放入到顺序表中,并将个元素依次放入到顺序表中,并将n赋给顺序表赋给顺序表的长度成员。算法如下:的长度成员。算法如下:void CreateList(SqList*&L,ElemType a,int n)/*建立顺序表建立顺序表*/int i;L=(SqList*)malloc(sizeof(SqList);for(i=0;idatai=ai;L-length=n;2.顺序表基本运
13、算算法顺序表基本运算算法(1)初始化线性表初始化线性表InitList(L)该该运运算算的的结结果果是是构构造造一一个个空空的的线线性性表表L。实实际际上上只只需需将将length成员设置为成员设置为0即可。即可。void InitList(SqList*&L)/引用型指针引用型指针 L=(SqList*)malloc(sizeof(SqList);/*分配存放线性表的空间分配存放线性表的空间*/L-length=0;本算法的时间复杂度为本算法的时间复杂度为O(1)。顺序表L (2)销毁线性表销毁线性表DestroyList(L)该运算的结果是释放线性表该运算的结果是释放线性表L占用的内存空间
14、。占用的内存空间。void DestroyList(SqList*&L)free(L);本算法的时间复杂度为本算法的时间复杂度为O(1)。(3)判定是否为空表判定是否为空表ListEmpty(L)该该运运算算返返回回一一个个值值表表示示L是是否否为为空空表表。若若L为为空空表表,则返回则返回1,否则返回否则返回0。int ListEmpty(SqList*L)return(L-length=0);本算法的时间复杂度为本算法的时间复杂度为O(1)。(4)求线性表的长度求线性表的长度ListLength(L)该该运运算算返返回回顺顺序序表表L的的长长度度。实实际际上上只只需需返返回回length成
15、员的值即可。成员的值即可。int ListLength(SqList*L)return(L-length);本算法的时间复杂度为本算法的时间复杂度为O(1)。(5)输出线性表输出线性表DispList(L)该该运运算算当当线线性性表表L不不为为空空时时,顺顺序序显显示示L中中各各元元素素的的值。值。void DispList(SqList*L)int i;if(ListEmpty(L)return;for(i=0;ilength;i+)printf(%c,L-datai);printf(n);本本算算法法中中基基本本运运算算为为for循循环环中中的的printf语语句句,故时间复杂度为故时间复
16、杂度为:O(L-length)或或O(n)(6)求某个数据元素值求某个数据元素值GetElem(L,i,e)该该运运算算返返回回L中中第第 i(1iListLength(L)个个元元素素的的值值,存放在存放在e中。中。int GetElem(SqList*L,int i,ElemType&e)if(iL-length)return 0;e=L-datai-1;return 1;本算法的时间复杂度为本算法的时间复杂度为O(1)。(7)按元素值查找按元素值查找LocateElem(L,e)该该运运算算顺顺序序查查找找第第1个个值值域域与与e相相等等的的元元素素的的位位序序。若若这样的元素不存在这样
17、的元素不存在,则返回值为则返回值为0。int LocateElem(SqList*L,ElemType e)int i=0;while(ilength&L-datai!=e)i+;if(i=L-length)return 0;else return i+1;本本算算法法中中基基本本运运算算为为while循循环环中中的的i+语语句句,故故时间复杂度为时间复杂度为:O(L-length)或或O(n)(8)插入数据元素插入数据元素ListInsert(L,i,e)该该 运运 算算 在在 顺顺 序序 表表 L的的 第第 i个个 位位 置置(1iListLength(L)+1)上插入新的元素上插入新的元
18、素e。思思路路:如如果果i值值不不正正确确,则则显显示示相相应应错错误误信信息息;否否则则将将顺顺序序表表原原来来第第i个个元元素素及及以以后后元元素素均均后后移移一一个个位位置置,腾腾出出一一个个空空位位置置插插入入新新元元素素,顺顺序序表表长度增长度增1。int ListInsert(SqList*&L,int i,ElemType e)int j;if(iL-length+1)return 0;i-;/*将顺序表将顺序表逻辑位序逻辑位序转化为转化为elem下标即下标即物理位序物理位序*/for(j=L-length;ji;j-)L-dataj=L-dataj-1;/*将将datai及后面
19、元素后移一个位置及后面元素后移一个位置*/L-datai=e;L-length+;/*顺序表长度增顺序表长度增1*/return 1;a0ai-1aian-1逻辑位序逻辑位序1 i i+1 n MaxSize 对于本算法来说对于本算法来说,元素移动的次数不仅与表长元素移动的次数不仅与表长L.length=n有关有关,而且与插入位置而且与插入位置i有关有关:当当i=n+1时时,移动次数为移动次数为0;当;当i=1时时,移动次数为移动次数为n,达到最大值。达到最大值。在线性表在线性表sq中共有中共有n+1个可以插入元素的地方。假设个可以插入元素的地方。假设pi(=)是在第是在第i个位置上插入一个元
20、素的概率个位置上插入一个元素的概率,则在则在长度为长度为n的线性表中插入一个元素时所需移动元素的的线性表中插入一个元素时所需移动元素的平均次数为平均次数为:因此插入算法的平均时间复杂度为因此插入算法的平均时间复杂度为O(n)。(9)删除数据元素删除数据元素ListDelete(L,i,e)删删除除顺顺序序表表L中中的的第第i(1iListLength(L)个个元元素。素。思思路路:如如果果i值值不不正正确确,则则显显示示相相应应错错误误信信息息;否否则则将将线线性性表表第第i个个元元素素以以后后元元素素均均向向前前移移动动一一个个位位置置,这这样样覆覆盖盖了了原原来来的的第第i个个元元素素,达
21、达到到删删除除该该元元素的目的素的目的,最后顺序表长度减最后顺序表长度减1。int ListDelete(SqList*&L,int i,ElemType&e)int j;if(iL-length)return 0;i-;/*将顺序表逻辑位序转化为将顺序表逻辑位序转化为elem下标即物理位序下标即物理位序*/e=L-datai;for(j=i;jlength-1;j+)L-dataj=L-dataj+1;/*将将datai之后的元素后前移一个位置之后的元素后前移一个位置*/L-length-;/*顺序表长度减顺序表长度减1*/return 1;a0ai-1aian-1逻辑位序逻辑位序1 i i
22、+1 n MaxSize 对于本算法来说对于本算法来说,元素移动的次数也与表长元素移动的次数也与表长n和和删除元素的位置删除元素的位置i有关有关:当当i=n时时,移动次数为移动次数为0;当;当i=1时时,移动次数为移动次数为n-1。在线性表。在线性表sq中共有中共有n个元素可以个元素可以被删除。假设被删除。假设pi(pi=)是删除第是删除第i个位置上元素的概个位置上元素的概率率,则在长度为则在长度为n的线性表中删除一个元素时所需移的线性表中删除一个元素时所需移动元素的平均次数为动元素的平均次数为:=因此删除算法的平均时间复杂度为因此删除算法的平均时间复杂度为O(n)。例例2.2 设设计计一一个
23、个算算法法,将将x插插入入到到一一个个有有序序(从从小小到到大大排排序序)的的线线性性表表(顺顺序序存存储储结结构构即即顺顺序表序表)的适当位置上的适当位置上,并保持线性表的有序性。并保持线性表的有序性。解解:先先通通过过比比较较在在顺顺序序表表L中中找找到到存存放放x的的位位置置i,然然后后将将x插插入入到到L.datai中中,最最后后将将顺顺序序表表的的长度增长度增1。void Insert(SqList*&L,ElemType x)int i=0,j;while(ilength&L-datailength-1;j=i;j-)L-dataj+1=L-dataj;L-datai=x;L-le
24、ngth+;查找插入位置查找插入位置元素后移一个位置元素后移一个位置a0ai-1aian-1逻辑位序逻辑位序1 i i+1 n MaxSize 例例2.3 设设计计一一个个算算法法,将将两两个个元元素素有有序序(从从小到大小到大)的顺序表合并成一个有序顺序表。的顺序表合并成一个有序顺序表。求解思路求解思路:将两个顺序表进行二路归并。将两个顺序表进行二路归并。归并到顺序表归并到顺序表r中中 k记录记录r中元素个数中元素个数 1(i=0)2(j=0)将将1(i=1)插入插入r(k=1)3(i=1)2(j=0)将将2(j=1)插入插入r(k=2)3(i=1)4(j=1)将将3(i=2)插入插入r(k
25、=3)5(i=2)4(j=1)将将4(j=2)插入插入r(k=4)5(i=2)10(j=2)将将5(j=3)插入插入r(k=5)将将q中余下元素插入中余下元素插入r中。中。顺序表顺序表p:135i顺序表顺序表q:241020j顺序表顺序表r:1kSqList*merge(SqList *p,SqList *q)SqList*r;int i=0,j=0,k=0;r=(SqList*)malloc(sizeof(SqList);while(ilength&jlength)if(p-datai dataj)r-datak=p-datai;i+;k+;else r-datak=q-dataj;j+;k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 PPT
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内