数据结构 ch02学习.pptx
《数据结构 ch02学习.pptx》由会员分享,可在线阅读,更多相关《数据结构 ch02学习.pptx(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/3/171 线性表(LinearlistLinearlist)是最简单且最常用的一种数据结构。这种结构是最简单且最常用的一种数据结构。这种结构是最简单且最常用的一种数据结构。这种结构是最简单且最常用的一种数据结构。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个没有后继的(尾)数据元素;此
2、外,每一个数据元素均有一个直接前驱和一个没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。直接后继数据元素。直接后继数据元素。直接后继数据元素。通过本章的学习,读者应能掌握线性表的逻辑结构和存储结构,以及线性通过本章的学习,读者应能掌握线性表的逻辑结构和存储结构,以及线性通过本章的学习,读者应能掌握线性表的逻辑结构和存储结构,以及线性通过本章的学习,读者应能掌握线性表的逻辑结构和存储结构,以及线性表的基本运算以及实现算法。表的基本运算以及实现算法。表的基本运算以及实现算法。表的基本运算以及实
3、现算法。本章学习导读第1页/共77页2023/3/172 线性表由一组具有相同属性的数据元素构成。数据元素的含线性表由一组具有相同属性的数据元素构成。数据元素的含义广泛,在不同的具体情况下,可以有不同的含义。义广泛,在不同的具体情况下,可以有不同的含义。1.1.线性表的定义线性表的定义 线线性性表表L L是是n n(n0n0)个个具具有有相相同同属属性性的的数数据据元元素素a a1 1,a a2 2,a a3 3,a an n组组成成的的有有限限序序列列,其其中中序序列列中中元元素素的的个个数数n n称称为为线线性性表表的的长度。长度。当当n=0n=0时称为空表,即不含有任何元素。时称为空表,
4、即不含有任何元素。常常将非空的线性表(n0)记作:(a1,a2,an)这里的数据元素ai(1 i n)只是一个抽象的符号,其具体含义在不同的情况下可以不同。22.1.1线性表的基本概念线性表的基本概念 第2页/共77页2023/3/173例1、26个英文字母组成的字母表(A,B,C、Z)例2、从1978年到1983年各种型号的计算机拥有量的变化情况。(6,17,28,50,92,188)例3、第3页/共77页2023/3/174从以上例子可看出线性表的逻辑特征是:在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;有且仅有一个终端结点an,它没有直接后继,而仅有一
5、个直接前趋an-1;其余的内部结点ai(2 i n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1。线性表是一种典型的线性结构。数据的运算是定义在逻辑结构上的,而运算的具体实现则是在存储结构上进行的。第4页/共77页2023/3/1752.线性表的基本运算 数据结构的运算是定义在逻辑结构层次上的,而运算的具体实数据结构的运算是定义在逻辑结构层次上的,而运算的具体实现则是建立在存储结构上的。现则是建立在存储结构上的。(1)(1)初始化线性表初始化线性表Initlist(L)Initlist(L)将线性表将线性表L L置为空表。置为空表。(2)(2)求线性表的长度求线性表的长度Getle
6、n(L)Getlen(L)求解并返回线性表所含元素的个数求解并返回线性表所含元素的个数n n。若线性表为空,则返回若线性表为空,则返回整数整数0 0。(3)(3)按序号取元素按序号取元素Getelem(L,i)Getelem(L,i)读取线性表读取线性表L L第第i i个数据元素,要求满足个数据元素,要求满足11iGetlen(L)iGetlen(L)。第5页/共77页2023/3/176(4)4)按值查找按值查找Locate(L,x)Locate(L,x)在线性表在线性表L L L L中查找值为的数据元素,若查找成功则返中查找值为的数据元素,若查找成功则返回第一个值为回第一个值为x x x
7、x的元素的序号或地址的元素的序号或地址;否则,在否则,在L L L L中未找到值中未找到值为的数据元素,返回一特殊值(例如为的数据元素,返回一特殊值(例如0 0 0 0),表示查找失败。),表示查找失败。(5)(5)插入元素插入元素Inselem(L,i,x)Inselem(L,i,x)在线性表在线性表L L的第的第 i i 个位置上插入一个值为个位置上插入一个值为 x x 的新元素,的新元素,这样使原序号为这样使原序号为 i,i+1,i,i+1,.,n,n 的数据元素的序号变为的数据元素的序号变为 i+1,i+2,i+1,i+2,.,n+1,n+1,要求要求11iGetlen(L)+1iGe
8、tlen(L)+1,插入后原插入后原表长增表长增1 1 1 1。(6)(6)删除元素删除元素Delelem(L,i)Delelem(L,i)在线性表在线性表L L L L中删除序号为中删除序号为i i i i的数据元素,删除后使序号为的数据元素,删除后使序号为 i+1,i+2,i+1,i+2,.,.,.,.,n n 的元素变为序号的元素变为序号i,i+1,i,i+1,.,n-1,n-1,要求要求11iGetlen(L)iGetlen(L),删除后表长减删除后表长减。第6页/共77页2023/3/1772.2 2.2 线性表的顺序结构及运算线性表的顺序结构及运算实现实现 线性表有两种基本的存储结
9、构:顺序存储结构和链式存储结构线性表有两种基本的存储结构:顺序存储结构和链式存储结构。1.线性表的顺序存储结构顺序表具有以下两个基本特点:顺序表具有以下两个基本特点:(1)(1)(1)(1)线性表的所有元素所占的存储空间是连续的。线性表的所有元素所占的存储空间是连续的。(2)(2)(2)(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。的。由于线性表的所有数据元素属于同一数据类型,所以每个元由于线性表的所有数据元素属于同一数据类型,所以每个元素在存储器中占用的空间(字节数)相同。因此,要在此结构中素在存储器中占用的空间(字节数)相同。
10、因此,要在此结构中查找某一个元素是很方便的,即只要知道顺序表首地址和每个数查找某一个元素是很方便的,即只要知道顺序表首地址和每个数据元素在内存所占字节的大小,就可求出第据元素在内存所占字节的大小,就可求出第i i i i个数据元素的地址。个数据元素的地址。第7页/共77页2023/3/178 假假设设线线性性表表中中的的第第一一个个数数据据元元素素的的存存储储地地址址(首首地地址址)为为LOCLOC(a(a1 1),每每一一个个数数据据元元素素占占k k个个字字节节,则则各各元元素素的的存存储储地地址址有有如如下下关关系:系:LOCLOC(a a2 2)=LOC(a=LOC(a1 1)k kL
11、OCLOC(a a3 3)=LOC(a=LOC(a2 2)k kLOCLOC(a ai i)=LOC(a=LOC(ai-1i-1)k k(2in2in)因此,线性表中第因此,线性表中第i i个元素个元素a ai i在计算机中的存储地址为:在计算机中的存储地址为:LOC(aLOC(ai i)=LOC(a)=LOC(a1 1)+(i-1)k)+(i-1)k(1in1in)即即在在顺顺序序存存储储结结构构中中,线线性性表表中中每每一一个个数数据据元元素素在在计计算算机机存存储储空空间间中中的的存存储储地地址址由由该该元元素素在在线线性性表表中中的的序序号号惟惟一一确确定定。一一般般来来说说,长度为长
12、度为n n的线性表的线性表(a a1 1,a a2 2,aan n)在计算机中的结构如下:在计算机中的结构如下:第8页/共77页2023/3/179第9页/共77页2023/3/1710 在具体实现时,一般用高级语言中的在具体实现时,一般用高级语言中的数组数组来对应连续的存储来对应连续的存储空间。设最多可存储空间。设最多可存储MaxLenMaxLen个元素,在个元素,在C C语言中可用数组语言中可用数组datadataMaxLenMaxLen来存储数据元素,为保存线性表的长度需定义一来存储数据元素,为保存线性表的长度需定义一个整型变量个整型变量lengthlength。线性表的第线性表的第l
13、l,2 2,n n个元素分别存放在个元素分别存放在此数组下标为此数组下标为0 0,1 1,length-1length-1数组元素中,如下图数组元素中,如下图所示所示第10页/共77页2023/3/1711这样,一个线性表的顺序存储结构需要两个分量。为体现数组data和length之间的内在联系,通常将它们定义在一个结构类型中。此处的元素类型用ElemType来表示。综上所述,在C C语言中,可用下述类型定义来描述顺序表:#defineMaxLen100/线性表的容量typedefintElemType/在实际应用中,将ElemType定义成实际类型typedefstructElemTyped
14、ataMaxLen;/定义存储表中元素的数组intlength;/线性表的实际长度sqList;sqListL;/定义表结构的变量第11页/共77页2023/3/17122.2.22.2.2线性表在顺序存储结构下的运算实现线性表在顺序存储结构下的运算实现线性表在顺序存储结构下的运算实现线性表在顺序存储结构下的运算实现 本节将讨论采用顺序存储结构之后,如何实现线性表的基本运算,并讨论各算法时间复杂度。1初始化顺序表初始化顺序表initlist(L)的实现的实现 顺序表的初始化即构造一个空表,顺序表L是否为空取决于其元素个数是否为0,因此,只要将表L中的表长度置为0,就可以实现建空表的功能。voi
15、dinitlist(sqList*L)L-length=0;2求线性表长度求线性表长度Getlen(L)的实现的实现 求线性表的长度算法如下:int Getlen(sqList*L)return L-length;该算法的时间复杂度为O(1)第12页/共77页2023/3/17133按序号取元素按序号取元素Getelem(L,i)的实现的实现 按前面的约定,序号为i的元素存储在数组下标为i-1的数组元素中,所以可直接从该数组元素中取得值。i的有效值应大于等于1和小于等于线性表的实际长度。ElemType Getelem(sqLlist*L,int i)if(iL-length)printf(“
16、error”);exit(1);return L-datai-1;4查找运算查找运算locate(L,x)的实现的实现要 确定值为x的元素在L表中的位置,需要依次比较各元素。当查询到第一个满足条件的数据元素时,返回其序号,否则返回0,表示查找失败。第13页/共77页2023/3/1714查找操作的具体实现算法如下:int Locate(sqList*L,ElemType x)int i;i=0;while(ilength&L-datai!=x)i+;if(ilength)return i;else return 0;5顺序表的插入算法顺序表的插入算法inselem(L,i,x)的实现的实现 顺
17、序表的插入是指在表的第i个位置上插入一个值为x的新元素,插入后使原表长为n的表:(a1,a2,ai-1,ai,ai+1,an),成为表长为 n+1n+1的表:由算法可知,对于表长为n的顺序表,在查找过程中,数据元素比较次数最少为1,最多为n,元素比较次数的平均值为(n+1)/2,时间复杂度为 O(n)。第14页/共77页2023/3/1715 (a1,a2,ai-1,x,ai,ai+1,an),i 的取值范围为1iin+1。下图表示一个顺序表中的数组在进行插入运算前后,数据元素在数组中的下标变化。序号元素0a01a12a2 i-1ai-1iaii+1ai+1i+2ai+2 numanum序号元
18、素0a01a12a2 i-1ai-1ixi+1aii+2ai+1 numanum插入x插入前插入后第15页/共77页2023/3/1716void Inselem(sqList*L,int i,Elemtype x)if(iL-length+1)printf(“Error!”);/插入位置出错 exit(1);if(L-length=MaxLen)printf(“overflow!”);/表已满 exit(1);for(j=L-length;j=i;j-)L-dataj+1=L-dataj;/数据元素后移 L-datai=x;/插入x L-length+;/表长度加1 第16页/共77页202
19、3/3/1717 假设表中任何位置插入概率是均等的,即Pi=1/(n+1),则:该算法的时间主要花费在移动数据元素上,移动个数取决于插入位置i和表的长度n。所以可以用数据元素的移动操作来估计算法的时间复杂度。在第i个位置上插入x,共需要移动n-i+1个元素,i的取值范围为:1in+1,即有n+1个位置可以插入。当i=n+1时,不需要移动结点;当i=1时需要移动n个结点。由此可以看出,算法在最好的情况下时间复杂性为O(1),最坏的时间复杂性是O(n)。由于插入的位置是随机的,因此,需要分析执行该算法移动数据元素的平均值。设在第i个位置上作插入的概率为Pi,则平均移动数据元素的次数:第17页/共7
20、7页2023/3/1718 由此可以看出,在线性表上做插入操作需要移动表中一半的数据元素,当n较大时,算法的效率是比较低的,所以在线性表上进行插入操作的时间复杂度为(n)。6 6顺序表的删除运算顺序表的删除运算顺序表的删除运算顺序表的删除运算Delelem(L,i)Delelem(L,i)的实现的实现的实现的实现 顺序表的删除运算是指将表中第 i 个元素从线性表中去掉,原表长为 n 的线性表(a1,a2,ai-1,ai,ai+1,an)。进行删除以后的线性表表长变为 n-1的表(a1,a2,ai-1,ai+1,an),i 的取值范围为:1in。图2-5表示一个顺序表的数组在进行删除运算前后,其
21、数据元素在数组中的下标变化。第18页/共77页2023/3/1719图2-5 线性表中的删除运算示意图第19页/共77页2023/3/1720 在线性表上完成上述运算通过以下两个操作来实现:(1)(1)线性表中第i个至第n个元素(共n-i+1个元素)依次向前移动一个位置。将所删除的元素ai覆盖掉,从而保证逻辑上相邻的元素物理位置也相邻。(2)(2)修改线性表长度,使其减1。线性表的删除算法如下:void Delelem(sqList*L,int i)/删除线性表中第i个位置上的元素 if(iL-length)/检查空表及删除位置的合法性 printf(不存在第i个元素);exit(0);for
22、(j=i;jlength-1;j+)L-dataj-1=L-dataj;/向前移动元素 L-length-;第20页/共77页2023/3/1721 删除算法的时间性能分析:与插入运算相同,删除运算的时间也主要消耗在移动表中数据元素上,删除第i个元素时,其后面的元素ai+1an都要向前移动一个位置,共移动了n-i个元素,所以在等概率的情况下,在线性表中删除数据元素所需移动数据元素的期望值,即平均移动数据元素的次数为:由此可以看出,在线性表上删除数据元素时大约需要移动表中一半的元素,显然该算法的时间复杂度为(n)。通常情况下,我们认为在线性表中任何位置删除元素是等概率的,即pi=1/n,则:第2
23、1页/共77页2023/3/1722【例2-1】利用线性表的基本运算,编写在线性表A A中删除线性表B B中出现的元素的算法。【解】本题的算法思路是:依次检查线性表B B中的每个元素,看它是否在线性表A A中。若在线性表A A中,则将其从A A中删除。本题的算法如下:void delete(sqList*A,sqList*B)int i,k;ElemType x;for(i=1;i0)Delelem(A,k);/若在线性表A中找到了,将其删除 第22页/共77页2023/3/1723【例2-2】利用线性表的基本运算,编写将线性表A A和B B中公共元素生成线性表C C的算法。【解】本题的算法思
24、路是:先初始化线性表C,然后依次检查线性表A中的每个元素,看它是否在线性表B中;若在线性表B中,则将其插入到线性表C中。本题的算法如下:void commelem(sqList*A,sqList*B,sqList*C)int i,k,j=1;ElemType x;Initlist(C);for(i=1;iO)Inselem(C,j,x);j+;/若在线性表B B中找到了,将其插入到C C中 第23页/共77页2023/3/1724【例2-3】将顺序表(a1,a2,a3,an)重新排列为以a1为界的两部分:a1前面的值均比a1小,a1后面的值都比a1大(这里假设数据元素的类型具有可比性,可设为整
25、型)。【解】基本思路:从第二个元素开始到最后一个元素,逐一向后扫描,当数据元素ai比a1大时,表明它已经在a1的后面,不必改变它与a1之间的位置,继续比较下一个;当数据元素ai比a1小时,表明它应该在a1的前面,此时将它前面的元素依次向下移动一个位置,然后将它置入最上方。算法如下:typedef int ElemType;void part(sqList*L)int i,j;ElemType x,y;x=L-data0;/将基准元素a1置入x中 for(i=1;ilength;i+)if(L-dataidatai;for(j=i-1;j=0;j-)/移动 L-dataj+1=L-dataj;L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 ch02学习 ch02 学习
限制150内