数据结构《第4章串存储与基本操作的实现》
严蔚敏数据结构-第四章 串

15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串
《数据结构与算法(C++语言版)》第4章_串

串函数与串的类定义
• 常用的 常用的C++串函数 串函数 • C++的串库(string.h)中提供了许多字符串的操作函数,几 个常用的C++字符串函数及其使用方法如下。 •假设已有以下定义语句:
串函数与串的类定义
• (1)串拷贝函数 • char *strcpy(char *s1, const char *s2),将字符串s2复制到字 符串数组s1中,返回s1的值。 • char *strncpy(char *s1, const char *s2, size_tn)将字符串s2中最 多n个字符复制到字符串数组s1中,返回s1的值。 • 例如:
串函数与串的类定义
• (3)串比较函数 • int strcmp(const char *s1, const char *s2),比较字符串s1和字 符串s2。函数在s1等于、小于或大于s2时,分别返回0、小 于0或者大于0的值。 • int strncmp(const char *s1, const char *s2, size_tn)比较字符串 s1中的n个字符和字符串s2。函数在s1等于、小于或大于s2 时,分别返回0、小于0或者大于0的值。 • 例如:
串模式匹配
• 无回溯的匹配算法 • 在上面介绍的匹配算法中,某趟匹配失败时,下一趟的匹 配相当于将子串P后移1位再从头与主串中对应字符进行比 较,即相当于i指示器回溯到上趟(最近失败的一趟)匹配 的起点的下一个位置,这样,主串中每个字符都要与子串 中的第1个字符对应一次,再向后比较。因此,主串中每个 字符参加比较的次数最多可达n次(n为子串长度),因此 时间复杂度为O(nm)。那么,能否使目标串中每个字符只参 加一次比较呢?也就是说,能否不回溯i指示器?回答是肯 定的。这个问题是由D.E.Knoth与V.R.Pratt和J.H.Morris同时 解决的,所以有的文献也称这种思想的串匹配算法为KMP 算法。
4 串

}
4.3.2 KMP 算法
由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出了一个改进算法, 消除了Brute-Force算法中串s指针的回溯,完成串的模式匹配。时 间复杂度为O(s.curlen+t.curlen),这就是Knuth-Morris-Pratt算法, 简称KMP 算法。 为了进一步讨论KMP算法,让我们首先讨论一个例子。假设 s=‚abacabab‛,t=‚abab‛,第一次匹配过程如下图所示:
1)j 退回到某个j=next[j]时有 si = tj,则指针各增1,继续匹配;
2)j 退回至 j=-1,此时令指针各增l,即下一次比较 si+1和 t0 。
KMP算法的描述如下: #define MaxLen <最大串的长度> //定义最大串存储空间 int Index_KPM(string s,string t) { int i,j,next[MaxLen]; GetNext(t,next); //先求得模式串的next函数值 i=0; //指向串s的第1个字符 j=0; //指向串t的第1个字符 while((i<s.curlen)&&(j<t.curlen)) if ((j==-1)||(s.str[i]==t.str[j])) { ++i; ++j;} else j=next[j]; //i不变,j回退 if (j>=t.curlen) return (i-t.curlen); //匹配成功 else return(0); //匹配失败 }
如:s=〃I’m a student〃的长度为13。 注意:在C语言中,用单引号引起来的单个字符与单个字符的 串是不同的, 如s1=‘a’与s2=〃a〃两者是不同的,s1表示字 符,s2表示字符串。 当两个串的长度相等且各对应位臵上的字符都相同时,这两个 串是相等的。 串中任意个连续字符组成的序列称为该串的子串。包含子串的 串被称为主串。 例如, "com"、"om"、"a" 和 "man" 都是 "commander" 的子串 。子串在主串中的位臵是指子串中第一个字符在主串中的位臵序 号。如子串"man"在主串"commander"中的位臵为4。
数据结构第4章 串

/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返 回负数*/
{ int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i]) return(s.ch[i] - t.ch[i]);
初 始 条 件 : 串 S 存 在 ,1≤pos≤StrLength(S) 且 1≤len≤StrLength(S)-pos+1
操作结果:用Sub返回串S的第pos个字符起长度为len的子串
返回主目录
(11)StrIndex(S,T,pos)
初始条件: 串S和T存在,T是非空串, 1≤pos≤StrLength(S)
return(s.len); }
返回主目录
(7)清空函数
StrClear(SString *s) /*将串s置为空串*/ {
s->len=0; }
返回主目录
(8)连接函数
(1) 连接后串长≤MAXLEN,则直接将B加在A的 后面。 (2) 连接后串长>MAXLEN且LA<MAXLEN,则B 会有部分字符被舍弃。 (3) 连接后串长>MAXLEN且LA=MAXLEN,则B 的全部字符被舍弃(不需连接)。
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++) s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;
数据结构第4章数组和串

● 教学目的:理解抽象数据类型数组的概念, 掌握数组的不同存储结构的实现及应用,了 解广义表的相关概念,掌握串的逻辑结构、 存储结构及其基本运算。
● 教学重点:数作在不同 存储结构上的实现。 ● 教学难点:带状矩阵的压缩存储;稀疏矩 阵的三元组表实现及其转置算法,堆结构的 串操作实现;串的模式匹配算法。
矩阵的压缩存储
printf("Array a:\n"); k=0; for(i=0;i<N;i++)//输出矩阵A { for(j=0;j<N;j++) if(i<j)printf("%5d",sa[M-1]); else printf("%5d",sa[i*(i+1)/2+j]); printf("\n"); } printf("Array b:\n"); k=0; for(i=0;i<N;i++)//输出矩阵B { for(j=0;j<N;j++) if(i>j)printf("%5d",sb[M-1]); else printf("%5d",sb[j*(j+1)/2+i]); printf("\n"); }}
矩阵的压缩存储
由此可见,要唯一表示一个稀疏矩阵,在存储三 元组表的同时还需存储该矩阵总的行数、列数及非 零元个数。 练习:写出图4-9(a)所示稀疏矩阵的三元组表。
三元组表(也是线性表)的存储方式主要有两种: 顺序存储和链式存储,从而可引出稀疏矩阵的两种 压缩存储方法:三元组顺序表和十字链表。 3、三元组顺序表
矩阵的压缩存储
数据结构-第4章 串

4.1 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 A=“abcdefbbcd”,B=“bcd”,B在A中的 序号为2。 特别地,空串是任意串的子串,任意串是其自 身的子串。
4.1.2 串的抽象数据类型定义
//查找ab子串
if (p->data==‘ a’ && p->next->data==‘b’)
{ p->data=‘x’; p->next->data=‘z’;
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=‘y’;
q->next=p->next; p->next=q;
s: a a a a b c d
t: a ab bac acb bc c ✓ 匹配成功 算法的思路是从s的每一个字符开始依次与t的 字符进行匹配。
4.2.1 Brute-Force算法
int BFIndex(SqString s,SqString t)
{ int i=0, j=0,k;
while (i<s.length && j<t.length)
4.1 串的类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法
本章要求
理解: 1、串的基本概念、类型定义 2、串的存储表示和实现 3、串的KMP算法
掌握: 4、串的简单模式匹配算法(BF)
第4章 串的基本概念
串(或字符串):是由零个或多个字符组成 的有限序列。
串的逻辑表示: S=“a1a2…ai…an”,其中S为 串名,ai (1≤i≤n)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。
数据结构第四章资料
设数组开始存放位置 LOC( 0, 0 ) = a LOC ( j, k ) = a + j * m + k
三维数组
按页/行/列存放,页优先的顺序存储
u1
①
u3
l1 l2 l3
u2
② ③
三维数组
a[m1][m2] [m3] 各维元素个数为
m1, m 2, m3
下标为 i1, i2, i3的数组元素的存储位置:
KMP(Knuth Morris Pratt)算法(一般理解)
《计算机程序设计艺术 第1卷 基本算法》 《计算机程序设计艺术 第2卷 半数值算法》 《计算机程序设计艺术 第3卷 排序与查找》
/~knuth/
KMP算法设计思想
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
基本操作:
(1) InitArray (&A,n,bound1, boundn) //构造数组A (2) DestroyArray (&A) // 销毁数组A (3) Value(A,&e,index1,…,indexn) //取数组元素值 (4) Assign (A,&e,index1,…,indexn) //给数组元素赋值
FORTRAN
二维数组的行序优先表示
a[n][m]
a[0][1] a[0][0] a[1][1] a[1][0] a a[2][0] a[2][1] a[n 1][0] a[n 1][1] a[0][m 1] a[1][m 1] a[2][m 1] a[n 1][m 1]
第4章 串、数组和广义表
串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版
串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版习题集解析部分第4章串——《数据结构题集》-严蔚敏.吴伟民版源码使⽤说明链接☛☛☛课本源码合辑链接☛☛☛习题集全解析链接☛☛☛相关测试数据下载链接☛本习题⽂档的存放⽬录:数据结构\▼配套习题解析\▼04 串⽂档中源码的存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04源码测试数据存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04\Data⼀、基础知识题4.1❶简述空串和空格串(或称空格符串)的区别。
4.2❷对于教科书4.1节中所述串的各个基本操作,讨论是否可由其他基本操作构造⽽得,如何构造?4.3❶设s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。
求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。
4.4❶已知下列字符串a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’,b = ‘ ’.s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))),t = Replace(f, SubString(f, 3, 6), c),u = Concat(SubString(c, 3, 1), d),g = ‘IS’,v = Concat(s, Concat(b, Concat(t, Concat(b, u)))),试问:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么?4.5❶试问执⾏以下函数会产⽣怎样的输出结果?void demonstrate(){StrAssign(s, ‘THIS IS A BOOK’);Replace(s, SubString(s, 3, 7), ‘ESE ARE’);StrAssign(t, Concat(s, ‘S’));StrAssign(u, ‘XYXYXYXYXYXY’);StrAssign(v, SubString(u, 6, 3));StrAssign(w, ‘W’);printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w));}//demonstrate4.6❷已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。
数据结构第四章串
(2) 置换操作:用联接算法来实现。用在求子串序号(a,b,h)中得到的 ind 将a分成3部分:第一部分是b在a中的第一个位置前的子串substr (a,1,ind-1);第二部分是b(以c来代替);第三部分是b在a中的最后一个 位置后的子串substr(a,ind+m,n)。 即 a substr(a,I,ind-1)||c||substr(a,ind+m,n)
4. 2 串的基本运算
对于串的基本操作,许多高级语言均提供了相应的运算或标准 库函数来实现。下面仅介绍几种常用的串运算。 (1)联接(concatenation) 联接是串的最基本,最重要的运算。两个串的联接是将一个串 紧接着放在另一个串的末尾。联接用符号“||”表示。 例如:a=”bei” b=“jing” a || b=“beijing” (2)求子串(substr) SUBSTR(a,m,n)功能: 从a 中截取子串,从第m个字符到第n个 字符的子串(m<n)。子串应是将串a中取出从标号m开始的连续n -m+1个字符。 例:SUBSTR(“ABCDEFG”,2,3)=”BC” 利用求子串及联接两种运算可以完成对串的插入、删除和修改。 例如: a=“bejing” b=“iy” ,将b插入到a的第二个字符之后 得到新的串s,则 s=substr(a,1,2) || b || substr(a,3,6) =“beiyjing”
(5)置换(repleace) 置换运算repleace(a,b,c)表示在a中搜索b,若b是a的 子串,就以c代替b,若不是,则经置换后,a不变。 例如:a=“monday”, b=“mon”, c=“thurs” repleace(a,b,c)=“thursday” 置换运算是将串a中所有的子串b用c来代替。 在一部分程序设计语言中没有实现,仍可用前三种运 算来完成。 置换算法过程:实现置换运算repleace(a,b,c),同 样也是在a中搜索是否与b相同的子串,若有,以c来代 替,再继续向下搜,直到在a中找不到和b相同的子串 为止。
数据结构第四章:串
例2、串的定位 、串的定位index(s,t,pos)
在主串s中取从第 个字符起、 相等的子串和T比较 在主串 中取从第pos个字符起、长度和串 相等的子串和 比较,若 中取从第 个字符起 长度和串T相等的子串和 比较, 相等,则求得函数值为i,否则值增1直至 中不存在和串T相等的子串 直至S中不存在和串 相等,则求得函数值为 ,否则值增 直至 中不存在和串 相等的子串 为止。 为止。
}
4.2 串的表示和实现
首先强调:串与线性表的运算有所不同,是以“串的整体” 首先强调:串与线性表的运算有所不同,是以“串的整体”作 为操作对象,例如查找某子串, 为操作对象,例如查找某子串,在主串某位置上插入一个子串 等。 串有三种机内表示方法: 串有三种机内表示方法:
定长顺序存储表示
顺序 存储 ——用一组地址连续的存储单元存储串值的字 用一组地址连续的存储单元存储串值的字 符序列, 静态存储方式 方式。 符序列,属静态存储方式。
4.1 串类型的定义 4.2 串的表示和实现
4.1 串的类型定义
4.1.1串的定义
定义:串(string)是由零个或多个任意字符组成的字 符序列,是数据元素为单个字符的特殊线性表。 的特殊线性表。 是数据元素为单个字符的特殊线性表 记为:an”
(n≥0 )
第4章 串(String) 章 )
本章主题:串的各种基本运算及其实现 本章主题: 教学目的:了解数据结构的基本概念, 教学目的:了解数据结构的基本概念,理解常用术语 教学重点: 教学重点: 掌握串的基本概念及其基本运算 掌握串的存储结构 主要内容: 主要内容: 1.串的基本概念 2.串的存储结构 2.串的存储结构 3.串的基本运算及其实现 3.串的基本运算及其实现
串其中0<=pos<=strlen(s)-1,且数组 且数组sub至少可容纳 至少可容纳len+1个字符。*/ 个字符。 串其中 且数组 至少可容纳 个字符
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构《第4章串存储与基本操作的实现》《数据结构》第4章、串存储与基本操作的实现第四章串存储与基本操作的实现本章学习要点◆熟悉串的相关概念以及串与线性表的关系◆重点掌握串的定长存储、堆分配存储的表示方法与基本操作的实现◆了解串的各种存储结构,能根据需要合理选用串的存储结构解决实际问题“串”(tring),是字符串的简称,它是一种特殊的线性表,其特殊性在于组成线性表的数据元素是单个字符。
字符串在计算机处理实际问题中使用非常广泛,比如人名、地名、商品名、设备名等均为字符串。
同样在文字编辑、自然语言理解和翻译、源程序的编辑和修改等方面,都离不开对字符串的处理。
4.1串的基本概念4.1.1串的概念1.串的定义串(tring)是由n个字符组成的有限序列,记为:S=”a0a1a2…an-1”(n≥0)。
其中,S是串的名字,字符序列a0a1a2…an-1是串的值,ai(0≤i≤n-1)可以是字母、数字或其他字符元素;由于在C语言系统中数组元素的下标是从0开始的,所以串中所含元素的序号等于该元素的下标值加1;串中所含字符的个数n称为该串的长度,长度为0的字符串称为空串(nulltring)。
从串的定义可以看出,串实际上是数据元素为字符的特殊的线性表。
例如:(1)A=“某123”(长度为4的串)(2)B=“12345654321”(长度为11的串)(3)C=“BeiJing”(长度为8的串)(4)D=“”(长度为0的空串)(5)E=“Thiiatring”(长度为16的串)(6)F=“ia”(长度为6的串)2.子串、主串和位置串中任意连续的字符组成的子序列称为该串的子串;相应地,包含子串的串称为主串。
串中的字符在串序列中的序号称为该字符在该串中的位置;子串的第一个字符在主串中的位置称为子串在主串中的位置。
显然,串为其自身的子串,并规定空串为任何串的子串。
显然,在不考虑空子串的情况下,一个长度为n的字符串具有n(n+1)/2个子串。
例如:在上例的(6)中串F就是(5)中串E的子串,且子串F在主串E中的位置是5。
由于空格符也是一个字符,所以在串G=“abcdefghne”中包含有子串“cdef”,而串“cdef”不是串G的子串。
串G中第一个字符e的位置是6,第二个字符e的位置是11。
3.串的比较如果两个串的长度相等且对应位置上的字符相同,则称这两个串相等。
两个串A、B的比较过程是:从前往后逐个比较对应位置上的字符的ASCII码值,直到不相等或有一个字符串结束为止,此时的情况有以下几种:(1)两个串同时结束,表示A等于B;(2)A中字符的ASCII码值大于B中相应位置上字符的ASCII码值或B串结束,表示A大于B;(3)B中字符的ASCII码值大于A中相应位置上字符的ASCII码值或A串结束,表示A小于B。
1/18《数据结构讲义》2022年11月11日例如:“abc”=“abc”,“abc”“abcdefg”,“132”>“123456”“ABab”“2+3”。
4.空格串由一个或多个空格字符组成的串称为空格串,空格串的长度为串中所含空格字符的个数。
在串操作中不要将空格串和空串混淆。
4.1.2串的基本操作尽管串的定义和线性表极为相似,但是串的基本操作和线性表有很大差别。
在线性表的基本操作中,大多以单个元素作为操作对象,比如对线性表的查找、访问、插入、删除和排序等;而在串的基本操作中,通常以串整体或串的一部分(子串)作为操作对象,比如子串的查找、截取子串、删除一个子串、插入子串和子串替换等操作。
串的基本操作主要有:(1)StrAign(&T,char)—由字符串常量char生成字符串T的操作。
(2)StrCopy(&T,S)—由串S复制生成串T的操作。
(5)Concat(&T,S1,S2)—将串S1和S2连接起来生成串T的操作。
(6)SubString(&Sub,S,po,len)—以串S中po位置开始的len个字符生成子串Sub的操作。
(7)Inde某(S,T,po)—返回子串T在S中po个字符以后出现的位置。
(8)Replace(&S,T,V)—将串S中所有不重叠子串T替换为串V的操作。
(9)StrInert(&S,po,T)—在串S中第po个字符前插入串T的操作。
(10)StrDelete(&S,po,len)—删除串S中第po个字符开始的len 个字符的操作。
4.2串的存储表示与实现既然串是线性表的特例,所以线性表的两种存储结构对于串也是适用的。
在应用中具体选用何种存储结构与串的操作有关,比如对串进行插入和删除操作运算时选用链存储结构较好,对串进行查找和求子串运算时选用顺序存储结构较好。
本章主要介绍串的3种存储表示方法:(1)串的定长顺序存储表示法(2)串的堆分配存储表示法(3)串的块链式存储表示法4.2.1串的定长顺序存储表示串的定长顺序存储表示是用一组地址连续的存储单元来存储串中的字符序列。
在串的定长顺序存储表示中,按照预定义的大小,为每个定长的串变量分配一个固定长度的存储区,所以可以用定长字符数组来表示。
1.定长顺序存储结构在C++运行环境中,定长顺序结构定义为:#include\#include\#defineMA某LEN255//定义串的最大长度为255typedefcharSString[MA某LEN+1];//定义定长顺序存储类型SString2/18《数据结构》第4章、串存储与基本操作的实现2.基本操作的C++程序实现(1)求串长度操作intLength_SS(SStringS)操作返回串S中所含字符的个数,即串的长度;如果S为空串则返回0。
intLength_SS(SStringS){inti=0;while(S[i])i++;returni;}(2)串连接操作intConcat_SS(SString&T,SStringS1,SStringS2)该操作将串S1、S2连接生成串T,如果在连接过程中产生了截断(即S1的长度加上S2的长度大于MA某LEN)则返回0,否则返回1。
intConcat_SS(SString&T,SStringS1,SStringS2){inti,j,k;i=j=k=0 ;while(T[i++]=S1[j++]);i--;while(i该操作截取串S中从第po个字符开始的连续的len个字符生成子串Sub,如果位置po和长度len合理则返回1,否则返回0.intSubString_SS(SString&Sub,SStringS,intpo,intlen){inti=0;if(po<1||len<0||po+len>Length_SS(S)+1)/某判断位置和长度是否合理某/return0;while(i3/18《数据结构讲义》2022年11月11日该操作用字符数组,初始化定长顺序串T。
如果不产生截断(长度合理)返回1,否则返回0。
intStrAign_SS(SString&T,char某){inti=0;while(i(5)串复制操作voidStrCopy_SS(SString&T,SStringS)该操作将定长顺序串S,复制到定长顺序串T。
voidStrCopy_SS(SString&T,SStringS){inti=0;while(T[i]=[i])i++;}(7)串的替换操作intReplace_SS(SString&S,intn,intm,SStringT)该操作将串S中从第n个字符开始的连续的m个字符替换成串T中的字符,如果n和m的选取合理则返回1,否则返回0。
intReplace_SS(SString&S,intn,intm,SStringT){SStringS1;intlen =Length_SS(T);inti=n-1,j=0,k=n+m-1;/某i为开始替换位置,j指向第一个替换字符,k为剩余字符的开始位置某/if(n<1||m<0||n+m>Length_SS(S)+1||Length_SS(S)+len-m>MA某LEN)/某判断位置是否合理某/return(0);StrCopy_SS(S1,S);/某将剩余部分复制到S1中某/while(S[i++]=T[j++]);/某替换S中指定部分的字符某/i--;while(S[i++]=S1[k++]);/某将剩余部分复制到S中某/return(1);}4/18《数据结构》第4章、串存储与基本操作的实现(8)主函数演示程序main()voidmain_SS(){SString1,2,3,ub,T;chartr1[100],tr2[100];intl1, l2,l3,po,len,n;while(1){cout<//表示从键盘输入一个可以含有空格字符的长度小于100的字符串到tr1中,//语句“cin>>tr1”不能输入空格字符(空格符表示输入结束)且对串的长度不做检查。
cin.getline(tr2,izeof(tr2));StrAign_SS(1,tr1);StrAign_SS(2,t r2);l1=Length_SS(1);l2=Length_SS(2);cout<cout<cout<cin>>po>>len;if(SubString_SS(ub,3,po,len))cout<>po>>len;cout <}(程序运行过程略)3.定长顺序存储的特点5/18《数据结构讲义》2022年11月11日(1)对于求串长度和串的复制操作而言,其时间复杂度依赖于字符串的长度;(2)在串删除和串插入操作时必须移动大量的字符;(3)如果在串输入、串连接、串插入和串替换操作中串值的长度超过MA某LEN,则按约定采取“截尾”法处理,这将导致操作结果的不合理。
4.2.2串的堆分配存储表示由于串操作基本上是以串整体的形式参与,在应用程序中串变量的长度相差较大,并且在操作中串值长度的变化也比较大。
因此,事先为串变量设置固定大小空间的数组不尽合理。
用堆分配存储表示串的方法是:在程序执行过程中,根据串变量值的大小,在堆空间中动态分配一个连续的地址空间来存储串变量中的字符,这样既可以避免产生串操作中的“截断”现象又能合理使用内存空间资源。
1.串的堆分配存储结构在C++运行环境中,堆分配存储结构定义为tructHString{char某ch;//串变量中字符数组的首地址intlength;//串的长度};2.在堆分配存储结构中串基本操作的C++程序实现(1)串的赋值操作voidStrAign_HS(HString&T,chartr[])该操作由字符串常量tr生成一个HString型串T。