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