项目四串数组矩阵广义表.ppt
《项目四串数组矩阵广义表.ppt》由会员分享,可在线阅读,更多相关《项目四串数组矩阵广义表.ppt(79页珍藏版)》请在三一办公上搜索。
1、项目四 串、数组、矩阵、广义表,项目导读 串是字符串的简称,它的每个数据元素由一个字符组成。串是一种特殊的线性表。随着非数值处理的广泛应用,字符串已成为某些程序系统的处理对象。本章主要介绍串的存储结构及基本运算。数组可视为线性表的推广,其特点是数据元素仍然是一个表。本章主要讨论数组的逻辑结构、存储结构、稀疏矩阵及其压缩存储等内容。广义表是线性表的一种推广。本章我们主要介绍广义表的定义及其存储结构。教学目标通过本章学习,要求掌握以下内容:1串的存储结构及其基本运算。2数组的存储结构及稀疏矩阵的压缩存储。3广义表的定义及其存储结构。,4.1 串,串是一种特殊的线性表,它的数据对象是字符集合,它的每
2、个元素都是一个字符,一系列相连的字符就组成了一个字符串,字符串简称串。计算机中的非数值处理的对象基本上是字符串数据。在程序设计语言中,字符串通常是作为输入和输出的常量出现的。随着计算机程序设计语言的发展,产生了字符串处理,字符串也作为一种变量类型出现在程序设计语言中。在汇编语言的编译程序中,源程序和目标程序都是字符串数据。在日常事务处理程序中,也有许多字符串应用的例子,如客户的名称和地址信息、产品的名称和规格等信息都是作为字符串来处理的。在文字处理软件中,在计算机翻译系统中,都使用了字符串处理的方法。,1.1 串的定义和特性串是由n个字符组成的有限序列,一般记为:s=a1 a2an(n0)其中
3、,s是串的名字,用双引号括起来的字符序列是串的值。双引号本身不属于串,它是定界符,用来标志字符串的起始和终止。ai(1in)可以是字母、数字或其他字符。n为串中字符的个数称为串的长度。空串:不含任何字符的串称为空串,它的长度n=0,记为s=。空格串:仅由空格组成的串称为空格串,它的长度为空格符的个数。为了清楚起见,在书写时把空格写成,如s=,则s串长度为n=1。,由于空格也是一个字符,因此它可以出现在其他串之间。计算串的长度时,这些空格符也要计算在内。如串s=I am a student.,该串的长度是15,而不是12。子串:串中任意个连续字符构成的序列称为该串的子串,而包含该子串的串称为母串
4、。例如,串s1=abcdefghijk,s2=def,则称s2是s1的子串,s1是s2的母串。两串相等:只有当两个串的长度相等,并且各对应位置上的字符都相同时,两个串才相等。,4.1.2 串的顺序存储及其基本操作实现 串的顺序存储结构,简称为顺序串。顺序串中的字符被顺序地存放在内存中一片连续的存储单元中。在计算机中,一个字符只占一个字节,所以串中的字符是顺序存放在相邻字节中的。在C语言中,串的顺序存储可用一个字符型数组和一个整型变量来表示,其中字符型数组存放串值,整型变量存放串的长度。用C语言描述如下:typedef struct string char chMAX;/*MAX是事先定义好的常
5、量,用以确定*/int len;/*字符串数组可能的最大长度*/STRING;,当计算机按字节(byte)单位编址时,一个机器字,即一个存储单元刚好存放一个字符,串中相邻的字符顺序地存放在地址相邻的字节中。若给定串s=data structure,则顺序串的存储如图4-1所示。,图4-1 顺序串存储示意图,当计算机按字(word)单位编址时,一个存储单元由若干个字节组成。这时串的顺序存储结构有非紧缩存储和紧缩存储两种方式。1串的非紧缩存储假设计算机的字长为32位,即4个字节(bytes),则一个存储单元仅存放一个字符时,就要浪费3个字节。若给定串s=data structure,则非紧缩存储方
6、式如图4-2所示。这种存储方式的优点是对串中的字符处理效率高,但对存储空间的利用率低。,图 4-2 非紧缩格式存储,图4-3 紧缩格式存储,2串的紧缩存储 根据计算机中的字的长度,尽可能将多个字符存放在一个字中。若给定串s=data structure,则紧缩存储方式如图4-3所示。与非紧缩存储的优缺点相反,紧缩存储方式对存储空间的利用率高,但对串的单个字符操作很不方便,需要花较多的处理时间。在C语言中,若采用非紧缩的顺序存储方式存放长度不超过MAX的串,可使用字符数组来实现,顺序串的类型定义如下:#define MAX 100 char chMAX;/*用字符型数组ch存放串值,MAX是已经
7、定义过的常量*/下面讨论顺序串的运算方法,主要包括求串长、串连接、两串相等判断、取子串、插入子串、删除子串、子串定位和子串置换。根据C语言数组下标从0开始的特点,串中的第1个元素存放在ch0中,其中字符的位置顺序为第0,1,MAX-1。,1求串长求串长就是求字符串的长度,将求得的长度值返回。#define MAX 50int length(char*s)/*求串s中所含字符个数*/int i;for(i=0;si!=0;i+);return(i);main()char chMAX=china”;int len;len=length(ch);printf(“%d”,len);,2串连接 串连接就
8、是把两个串连接在一起,其中一个串接在另一个串的末尾,生成一个新串。如给出两个串s1和s2,把s2连接到s1之后,生成一个新串s。其算法描述如下:#define MAX 50/*定义一常量MAX为50*/char*connect(char*s1,char*s2)char sMAX;int i;if(length(s1)+length(s2)=MAX)/*当s1和s2的长度之和小于或等于MAX时*/for(i=0;ilength(s1);i+)/*将s1存放到s中*/si=s1i;for(i=0;ilength(s2);i+)/*将s2存放到s中*/slength(s1)+i=s2i;slengt
9、h(s1)+i=0;/*设置串结尾标志*/,else/*当s1和s2的长度之和大于MAX时*/s0=0;/*不能连接,置s空串*/return(s);/*连接成功,返回s,不成功时返回空串*/main()/*主程序*/char a1MAX=Beijing,a2MAX=China,*s;/*字符数组a1和a2并给这两个数组赋初值*/s=connect(a1,a2);/*调用connect函数*/printf(n%sn,s);/*输出结果*/输出结果为:Beijing China,在该例中,有两个串分别为a1=Beijing,a2=China,调用函数connect(a1,a2)后,函数的串值为s
10、=Beijing China。3两串相等判断 只有当两个串的长度相等,并且各对应位置上的字符都相等时,两个串才相等。如给定两个串s1和s2,判断这两个串是否相等。当s1与s2相等时,返回函数值1,否则返回函数值0。算法如下:,#define MAX 50/*定义一常量MAX为50*/int equal(char*s1,char*s2)int i,m,n;m=length(s1);/*求s1字符串的长度*/n=length(s2);/*求s2字符串的长度*/if(m!=n)/*如果s1与s2长度不等*/return(0);/*返回函数值0*/else/*如果s1与s2长度相等*/for(i=0;
11、im;i+)/*判断s1和s2中各对应位置上字符是否相等*/if(s1i!=s2i)/*如果某一对应位置上字符不相等*/return(0);/*返回函数值0*/*两个串完全相等时*/return(1);/*返回函数值1*/,main()/*主程序*/char a1MAX=Beijing,a2MAX=China;/*定义两个字符数组并给它们赋初值*/int r;r=equal(a1,a2);/*调用equal函数*/if(r)printf(“equaln”);/*输出结果*/else printf(“not equaln”);输出结果为:not equal,在该例中,有两个串分别为a1=Beij
12、ing,a2=China,调用函数equal(a1,a2)后,函数的返回值为0,所以才输出not equal。4取子串 取子串就是在给定串中,从某一位置开始连续取出若干字符,作为子串的值。例如,给定串s,从s中的第n1个字符开始,连续取出n2个字符,放在t串中。其算法描述如下:,#define MAX 50/*定义一常量MAX为50*/int substring(char*s,int n1,int n2,char*t)int i,k;if(n1length(s)/*如果位置不对则返回0值*/return(0);for(k=0;(kn2),main()/*主程序*/char a1MAX=Beij
13、ing China,sMAX;/*定义字符数组并给该数组赋初值*/if(substring(a1,4,4,s))/*如果取子串成功,则函数返回值为1,输出该子串*/printf(“%s”,s);else/*函数返回值为0时,输出不成功信息*/printf(“unsuccess”);输出的结果为:jing,5插入子串 插入子串就是在给定串s的第p个字符之前插入一个串t。插入成功函数返回值为1,否则函数返回值为0。其算法描述如下:#define MAX 50int insert(char*s,int p,char*t)int i,j,k;i=length(s);j=length(t);/*求S串和
14、t串的长度分别赋给变量i,j*/if(pi)|(i+j)=MAX)return(0);/*如果位置不合适或者两个字符串合在一起的长度比MAX大时函数返回0值。*/for(k=i-1;kp-2;k-)sk+j=sk;/*将s 串中从第p个字符开始一直到串尾分别向后挪动j个位置以便将t串插入*/,for(k=0;kj;k+)sp-1+k=tk;si+j=0;return(1);main()/*主程序*/char sMAX=Beijing China,tMAX=Shanghai;/*定义两个字符数组并分别给它们赋初值*/int i=8;if(insert(s,i,t)printf(“%s”,s);e
15、lse printf(“insert is unsuccessful”);输出结果为:Beijing Shanghai China,6删除子串 在串中删除从某一位置开始连续的字符。如在s串中,从第p个字符开始连续删除j个字符。可能出现三种情况:(1)如果p值不在s串范围内,不能删除。(2)从第p个字符开始到最后的字符数不足j个,删除时,不用移动元素。(3)p和j都可以满足要求。删除后,要把后面其余的元素向前移动j位。删除成功后函数返回值为1,否则函数返回值为0。删除子串的C语言算法描述如下:,#define MAX 50/*定义一常量MAX为50*/int delete(char*s,int
16、p,int j)int i,k;i=length(s);/*求串s的长度*/if(pi)return(0);/*如果位置不合适函数返回0值*/if(p+j-1)i)sp-1=0;/*从第p个字符开始到最后的字符数不足j个,删除时,不用移动元素,只需给sp-1时赋值为0即可*/elsefor(k=0;k=(i-p-j+1);k+)/*删除j个字符后要把后面的其余的元素向前移动j位。*/sp-1+k=sp-1+j+k;si-j=0;return(1);,main()/*主程序*/char sMAX=Beiing Shanghai China;int i=8,j=9;if(delete(s,i,j)
17、printf(“%s”,s);else printf(“delete is unsuccessful”);输出结果为:Beijing China13 在该例中,串s=Beijing Shanghai China,在调用了delete(s,i,j)后,得到的结果为s=Beijing China。,7子串定位 子串定位运算也称串的模式匹配。这是一种很常用的串运算,在文本编辑中经常用到这种运算。所谓模式匹配,就是判断某个串是否是另一个已知串的子串。如果是其子串,则给出该子串在这个串中的起始位置,即子串第一个字符的位置。如果不是,则给出不是的信息。下面介绍一个简单的模式匹配算法。设有一母串s和一子串s
18、1,判断母串s中是否包含子串s1。其判断的基本方法是:从母串s中的第一个字符开始,按s1子串的长度与s1子串中的字符依次对应比较。若不匹配,则再从s串中的第二个字符开始,仍按s1子串的长度与s1子串中的字符依次对应比较。如此反复进行比较。直到匹配成功或者母串s中剩余的字符少于s1的长度为止。若匹配成功,则返回s1串在s串中的位置。若匹配不成功,则返回函数值0。,子串定位的算法如下:#define MAX 50/*定义一常量MAX为50*/int match(char*s,char*s1)int i,j,m,n;i=j=0;m=length(s);/*将s串的长度赋给m变量*/n=length(
19、s1);/*将s1串的长度赋给n变量*/while(i=n)return(i-n+1);/*如果j=n那么s1 就是s的子串并返回其在s串中的位置*/else return(0);,main()/*主程序*/char aMAX=Beijing Shanghai China,a1MAX=Shanghai;/*定义两个字符数组,给字符数组赋初值*/int r;r=match(a,a1);/*调用match函数*/printf(n%d,r);/*输出结果*/输出结果为:9,8串置换 串置换就是把母串中的某个子串用另一个子串来替换。字符串替换算法可以用删除子串的算法和插入子串的算法来实现。在这里不在详
20、述,大家可以依照上面的程序稍加改动即可。4.1.3 串的链式存储及其基本操作实现串的链式存储结构与单链表类似。由于串结构的特殊性-结构中的每个数据元素是一个字符,用链表存储串值时,就存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个字符,如图4-3所示的链表,其结点大小分别为4和1。,图4-3 串的链式存储结构,对于结点大小超过1的结点,在存储串值时,最后一个结点的data域不一定正好填满,这时就要以一个非串值字符(例如)补足。在链式存储方式中,结点大小的选择和顺序存储方式的格式选择一样重要,直接影响对串的处理的效率。总的来说,由于串的特殊性,使得采用采用链式存储结构存储串
21、不太实用,所以并不常用链式存储结构方式存储串。,4.1.4 串的应用举例 文本编辑是串应用的一个典型例子。有很多种文本编辑的软件,用于不同的应用领域,如一般的办公室文书编辑、专业用的报刊和书籍编辑。不同的软件公司也开发出了不同的文本编辑软件。这些文本编辑软件的大小、功能都不一样,但其基本操作原理都是一致的,通常都是串的插入、删除、查找替换以及字符格式的设置等。这些编辑软件进行文本处理时,对整个文本进行了不同的拆分方法,如页、段、行、句、词和字等。在编辑过程中,可以把整个文本看成是一个字符串,也可以把它叫做文本串,那么页就是文本串的子串,行又是页的子串,等等。这样,在编辑过程中,就能够以不同的单
22、位对文本进行各种不同功能的操作。计算机在执行文本编辑程序时,要对文本建立起各种功能所需要的存储信息表,如页表、行表。在编辑过程中,要设立页指针、行指针和字符指针。在进行插入、删除等操作时都是按照这些指针进行相应的修改工作。如插入字符后,后面的文本要相应向后移动,删除字符后,后面的文本要相应向前移动等。,4.2 数组,4.2.1 数组的定义和运算数组是最常用的一种数据结构,在大多数程序设计语言中都把数组作为固有的数据类型。数组类似于线性表,是由同种类型的数据元素构造而成,数组的每个元素由一个值和一组下标所决定,数组中各元素之间的关系是由各元素的下标体现出来。也就是,在有下标指定数组的相关元素中都
23、存在一个与它相对应的值。一维数组记为An或A=(a0,a1,an-1),每个数组元素由一个值和一个下标来确定,数组元素的下标的顺序可作为一个线性表中的序号。二维数组,又称矩阵,图4-1为矩阵的表示形式。,图4-1 矩阵的表示,图4-1 矩阵的表示,二维数组中的每一个元素由矩阵元素aij值及一组下标(i,j)(i=0,1,2,m-1;j=0,1,2,n-1)来确定。每组下标(i,j)都唯一地对应一个值aij。二维数组中的每一个元素都要受到两个关系即行关系第i行的行表ai0,ai1,ai2,ain-1,同行元素aij是aij-1的直接后继;另一个是表达列关系第j列的列表a0j,a1j,a2j,am
24、-1j,同列元素aij是ai-1j的直接后继。可以把二维数组看成是这样一个线性表,它的每个元素是一个线性表。例如,图4-1所示是一个二维数组,以m行n列的矩阵形式表示:A=(a00,a01,a0n-1),(a10,a11,a1n-1),(am-10,am-11,am-1n-1)它的每个数组元素是一个以行序为主的线性表。而A=(a00,a10,am-10),(a01,a11,am-11),(a0n-1,a1n-1,am-1n-1)它的每个数组元素是一个以列序为主的线性表。对于数组,通常只有两种运算。1给定一个下标,存取相应的数据元素。2给定一个下标,修改相应的数据元素的某个数据项的值。,4.2.
25、2 数组的顺序存储结构由于数组一般不作删除或插入运算,所以一旦数据被定义后,数组中的元素个数和元素间的关系就无需变动。一般采用顺序存储结构,而随机存取是顺序存储结构的主要特性。在这里我们只讨论二维数组的顺序存储结构,大部分高级语言对二维数组的顺序存储均采用以行序为主的存储方式,如图4-2(b)所示,如C语言。但在有的语言(如Fortran)中采用的是以列序为主的存储方式,如图4-2(c)所示。,图4-2 二维数组的两种存储结构,在C语言中,数组中任一元素aij的地址计算公式为:LOC(Aij)=LOC(A00)+(in+j)s 0im-1,0jn-1 其中,LOC(A00)为数组的起始位置,s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目 数组 矩阵 广义
链接地址:https://www.31ppt.com/p-5889784.html