数据结构ch04学习教案.pptx
《数据结构ch04学习教案.pptx》由会员分享,可在线阅读,更多相关《数据结构ch04学习教案.pptx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构数据结构(sh j ji u)ch04第一页,共36页。2023/2/72023/2/72 2 在计算机的应用中,非数值处理问题的应用越来越多。如在汇编在计算机的应用中,非数值处理问题的应用越来越多。如在汇编程序和编译程序中,源程序和目标程序都是作为一种字符串数据进行程序和编译程序中,源程序和目标程序都是作为一种字符串数据进行处理的。在事务处理系统中,用户的姓名和地址及货物的名称、规格处理的。在事务处理系统中,用户的姓名和地址及货物的名称、规格等也是字符串数据。等也是字符串数据。字符串一般简称为串,可以将它看作是一种特殊的线性表,这字符串一般简称为串,可以将它看作是一种特殊的线性表,这
2、种线性表的数据元素的类型总是字符型的,字符串的数据对象约束为种线性表的数据元素的类型总是字符型的,字符串的数据对象约束为字符集。字符集。在线性表的基本操作中,大多以在线性表的基本操作中,大多以“单个元素单个元素”作为操作对象,作为操作对象,而在串中,则是以而在串中,则是以“串的整体串的整体”或一部分作为操作对象。因此或一部分作为操作对象。因此(ync),线性表和串的操作有很大的不同。,线性表和串的操作有很大的不同。本章主要讨论串的基本概念、存储结构和一些基本的串处理操本章主要讨论串的基本概念、存储结构和一些基本的串处理操作。作。本章本章本章本章(bn zhn)(bn zhn)学习学习学习学习导
3、读导读导读导读第1页/共36页第二页,共36页。2023/2/72023/2/73 3 串是一种特殊的线性表,它的数据对象是字符集合。串是一种特殊的线性表,它的数据对象是字符集合。4.1.1 4.1.1 串的定义串的定义 串(或字符串)是由零个或多个字符组成的有限序列。一般记作:串(或字符串)是由零个或多个字符组成的有限序列。一般记作:s=s=c0c1c2cn-1c0c1c2cn-1 (n0)(n0)其中其中(qzhng)(qzhng):s s为串名,用双引号括起来的字符序列是串的值;为串名,用双引号括起来的字符序列是串的值;ci(0in-1)ci(0in-1)可以是字母、数字或其它字符;双引
4、号为串值的定界符,不是串的一部分;字符串字符的数目可以是字母、数字或其它字符;双引号为串值的定界符,不是串的一部分;字符串字符的数目n n称为串的长度。称为串的长度。零个字符的串称为空串,通常以两个相邻的双引号来表示空串零个字符的串称为空串,通常以两个相邻的双引号来表示空串 如:如:s=s=,它的长度为零;,它的长度为零;仅由空格组成的的串称为空格串仅由空格组成的的串称为空格串 如:如:s=s=;4.1 串及其运算串及其运算(yn sun)第2页/共36页第三页,共36页。2023/2/72023/2/74 4 若串中含有空格,在计算串长时,空格应计入若串中含有空格,在计算串长时,空格应计入(
5、j r)串的长度中串的长度中 如:如:s=Im a student的长度为的长度为13。注意:在注意:在C语言中,用单引号引起来的单个字符与单个字符的串是不同的,语言中,用单引号引起来的单个字符与单个字符的串是不同的,如如s1=a与与s2=a两者是不同的,两者是不同的,s1表示字符,表示字符,s2表示字符串。表示字符串。当两个串的长度相等且各对应位置上的字符都相同时,这两个串是相等的。当两个串的长度相等且各对应位置上的字符都相同时,这两个串是相等的。串中任意个连续字符组成的序列称为该串的子串。包含子串的串被称为主串。串中任意个连续字符组成的序列称为该串的子串。包含子串的串被称为主串。例如,例如
6、,com、om、a和和man都是都是commander的子串。子串在主串中的的子串。子串在主串中的位置是指子串中第一个字符在主串中的位置序号。如子串位置是指子串中第一个字符在主串中的位置序号。如子串man在主串在主串commander中的位置为中的位置为4。第3页/共36页第四页,共36页。2023/2/72023/2/75 5 串是一种简单的数据结构,它的逻辑(lu j)结构与线性表十分相似,区别仅在于串的数据对象是字符集。串的基本运算与线性表的基本运算有很大差别。通常在串的基本运算中,以“串的整体”作为操作对象;而在线性表的基本运算中,大多以“单个元素”作为操作对象。4.1.2 串的基本运
7、算串的基本运算 串的常用基本运算主要有:串的常用基本运算主要有:1Strassign(s,chars)功能:赋值运算功能:赋值运算 将串常量将串常量chars的值赋给串变量的值赋给串变量s。例如例如(lr):执行:执行strassign(s,abcd)运算之后,运算之后,s的值为的值为abcd。第4页/共36页第五页,共36页。2023/2/72023/2/76 62Assign(s,t)功能:赋值运算。将串变量功能:赋值运算。将串变量t的值赋给串变量的值赋给串变量s。例如:例如:t=abcd,则执行,则执行Assign(s,t)运算之后,运算之后,s的值为的值为abcd。3Equal(s,t
8、)功能:判相等运算。若功能:判相等运算。若s与与t的值相等则运算结果的值相等则运算结果(ji gu)为为1,否,否则为则为0。4Length(s)功能:求串长运算。求串功能:求串长运算。求串 s序列中字符的个数,即串的长度。序列中字符的个数,即串的长度。5Concat(s,t)功能:联接运算。将串功能:联接运算。将串t的第一个字符紧接在串的第一个字符紧接在串 s的最后一个字符的最后一个字符之后,联接得到一个新串。例如之后,联接得到一个新串。例如s=man,t=kind,则执行,则执行Concat(s,t)运算后得到的新串为运算后得到的新串为mankind。第5页/共36页第六页,共36页。20
9、23/2/72023/2/77 7 6Insert(s,pos,t)功能:插入运算,当1pos Length(s)+1时,在串 s的第 pos 个字符之前插入串 t。7Delete(s,pos,len)功能:删除运算。当1posLength(s)且0lenLength(s)-pos+1时,从串s中删去从第pos个字符起长度为len的子串。8Replace(s,pos,len,t)功能:置换运算。当1posLength(s)且0lenLength(s)-pos+1时,用串t替换串s中从第 pos 个字符起长度为len的子串。对于串的基本操作,许多高级语言均提供了相应的运算或标准库函数来实现。下面
10、(xi mian)仅介绍几种在C语言中常用的串运算,其它的串操作见文件。第6页/共36页第七页,共36页。2023/2/72023/2/78 8 定义下列几个变量:char s120=“dirtreeformat”,s220=“file.mem”;char s330,*p;int result;(1)求串长(length)int strlen(char s);/求串的长度 例如:printf(“%d”,strlen(s1);输出13 (2)串复制(copy)char*strcpy(char to,char from);该函数将串from复制到串to中,并且返回一个指向(zh xin)串to的开
11、始处的指针。例如:strcpy(s3,s1);/s3=“dirtreeformat”第7页/共36页第八页,共36页。2023/2/72023/2/79 9 (3)联接(concatenation)char strcat(char to,char from)该函数将串from复制到串to的末尾,并且返回一个指向串to的开始处的指针。例1、求子串 求子串的过程(guchng)即为复制字符序列的过程(guchng),将串S中的第pos个字符开始长度为len的字符复制到串T中。void substr(string sub,string s,int pos,int len)if(posstrlen(s
12、)-1|len0)n=strlen(s);m=strlen(t);i=pos;while(in-m+1)substr(sub,s,i,m);if(strcmp(sub,t)!=0)+i;else return(i);return(0);第9页/共36页第十页,共36页。2023/2/72023/2/711114.2 串的存储串的存储(cn ch)结构结构 串是一种特殊的线性表,其存储结构与线性表的存储结构类似,只不过组成串的结点是单个字符。串的存储结构表示有两种方法:静态存储和动态(dngti)存储 静态存储采用顺序存储结构,动态(dngti)存储采用的是链式存储和堆存储结构。4.2.1 串的
13、顺序存储结构及其基本运算的实现 1顺序存储结构(静态)串的顺序存储结构是采用与其逻辑结构相对应的存储结构,将串中的各个字符按顺序依次存放在一组地址连续的存储单元里,逻辑上相邻的字符在内存中也相邻。第10页/共36页第十一页,共36页。2023/2/72023/2/71212 类类似似于于线线性性表表的的顺顺序序存存储储结结构构,用用一一组组地地址址连连续续的的存存储储单单元元存存储储串值的字符序列。串值的字符序列。这这是是一一种种静静态态(jngti)存存储储结结构构,串串值值的的存存储储分分配配是是在在编编译译时时完完成成的的。因因此此,需需要要预预先先定定义义串串的的存存储储空空间间大大小
14、小。如如果果定定义义的的空空间间过过大大,则则会会造造成成空空间间浪浪费费;如如果果定定义义的的空空间间过过小小,则则会会限限制制串串的的某某些些运运算算,如如联联接、置换运算等。接、置换运算等。2基本运算在顺序存储结构上的实现基本运算在顺序存储结构上的实现在顺序存储结构中,串的类型定义描述如下:在顺序存储结构中,串的类型定义描述如下:#define MaxLen;/定义能处理的最大的串长度定义能处理的最大的串长度 typedef struct char strMaxLen;/定义可容纳定义可容纳MaxLen个字符的字符数组个字符的字符数组 int curlen;/定义当前实际串长度定义当前实
15、际串长度 string;第11页/共36页第十二页,共36页。2023/2/72023/2/71313以下给出采用以下给出采用(ciyng)顺序存储结构时串的联接运算。顺序存储结构时串的联接运算。(1)Concat(s,t)string Concat(string s,string t)/将串将串t的第一个字符紧接在串的第一个字符紧接在串 s 的最后一个字符之后的最后一个字符之后 string ch;int i;ch.curlen=s.curlen+t.curlen;/将将s.str0s.strs.curlen-1复制到复制到ch for(i=0;is.curlen;i+)ch.stri=s.
16、stri;/将将t.str0t.strt.curlen-1复制到复制到ch for(i=0;it,则输出正数;,则输出正数;如果如果st,则输出负数。,则输出负数。算法如下:算法如下:int strcmp(string s,string t)int i,st_len;if(s.cur1en t.cur1en)/求取求取s和和t长度短者长度短者 st_len=s.cur1en;else 第13页/共36页第十四页,共36页。2023/2/72023/2/71515else st_len=t.cur1en;for(i=0;(ist_len)&(s.stri=t.stri);i+);if(i=st_
17、len)if(s.cur1en=t.cur1en)/s=t return 0;else if(s.cur1ent.cur1en)/st return 1;else return s.stri-t.stri;/st或或st第14页/共36页第十五页,共36页。2023/2/72023/2/716164.2.2 串的链式存储结构及其基本运算的实现串的链式存储结构及其基本运算的实现 1链式存储结构链式存储结构 顺序串上的插入和删除操作不方便,需要顺序串上的插入和删除操作不方便,需要(xyo)移动大量的字符。因此,我们可用单链表方式来存储串值,串的这种链式存储结构简称为链串。移动大量的字符。因此,我们
18、可用单链表方式来存储串值,串的这种链式存储结构简称为链串。用单链表存放串,每个结点仅存储一个字符,如图用单链表存放串,每个结点仅存储一个字符,如图4-1所示,因此,每个结点的指针域所占空间比字符域所占空间要大得多。为了提高空间的利用率,我们可以使每个结点存放多个字符,称为块链结构,如图所示,因此,每个结点的指针域所占空间比字符域所占空间要大得多。为了提高空间的利用率,我们可以使每个结点存放多个字符,称为块链结构,如图4-2所示每个结点存放所示每个结点存放4个字符。个字符。第15页/共36页第十六页,共36页。2023/2/72023/2/71717图图4-1 结点大小为结点大小为1的链式存储的
19、链式存储(cn ch)结构结构 图图4-2 结点大小结点大小(dxio)为为4的链式存储结的链式存储结构构第16页/共36页第十七页,共36页。2023/2/72023/2/71818 2 2基本运算在链式存储结构上的实现基本运算在链式存储结构上的实现 链式存储结构的链式存储结构的C C语言定义如下:语言定义如下:#define CHUNKSIZE#define CHUNKSIZE ;/;/定义结点的大小定义结点的大小 typedef struct Chunk /typedef struct Chunk /结点结构结点结构 char strCHUNKSIZE;char strCHUNKSIZE
20、;struct Chunk *next;struct Chunk *next;Lstring;Lstring;一个链串由头指针唯一确定一个链串由头指针唯一确定(qudng)(qudng)。这种结构便于进行插入和删除运算,但存储空间利用率太低。这种结构便于进行插入和删除运算,但存储空间利用率太低。为了提高存储密度,可使每个结点存放多个字符。通常将结点数据域存放的字符个数定义为结点的大小,显然,当结点大小大于为了提高存储密度,可使每个结点存放多个字符。通常将结点数据域存放的字符个数定义为结点的大小,显然,当结点大小大于 1 1时,串的长度不一定正好是结点的整数倍,因此要用特殊字符来填充最后一个结点
21、,以表示串的终结。时,串的长度不一定正好是结点的整数倍,因此要用特殊字符来填充最后一个结点,以表示串的终结。第17页/共36页第十八页,共36页。2023/2/72023/2/71919 对于结点大小不为对于结点大小不为1 1的链串,其类型定为义只需对上述的链串,其类型定为义只需对上述(shngsh)(shngsh)的结的结点类型做简单的修改即可,如结点大小为点类型做简单的修改即可,如结点大小为4 4的定义为:的定义为:#define nodesize 80#define nodesize 80 typedef struct node typedef struct node char data
22、4;char data4;struct node*next;struct node*next;lstring;lstring;采用链式存储结构(结点大小为采用链式存储结构(结点大小为1 1),实现串的联接、求子串以及串的),实现串的联接、求子串以及串的置换基本运算见教科书置换基本运算见教科书 P83 P83。第18页/共36页第十九页,共36页。2023/2/72023/2/72020 4.2.3 串的堆分配存储结构及其基本运算的实现串的堆分配存储结构及其基本运算的实现 1堆分配存储结构堆分配存储结构 堆存储结构的特点是,仍以一组空间足够大的、地址连续的存储单元存放串值字符序列,但它们的存储空
23、间是在程序执行过程中动态分配的。所以也称为堆存储结构的特点是,仍以一组空间足够大的、地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。所以也称为(chn wi)动态存储分配的顺序表。每当产生一个新串时,系统就从剩余空间的起始处为串值分配一个长度和串值长度相等的存储空间。动态存储分配的顺序表。每当产生一个新串时,系统就从剩余空间的起始处为串值分配一个长度和串值长度相等的存储空间。在在C语言中,存在一个称为语言中,存在一个称为(chn wi)“堆堆”的自由空间,由动态分配函数的自由空间,由动态分配函数malloc()分配一块实际串长所需的存储空间,如果分配成功,则返
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 ch04 学习 教案
限制150内