数据结构5串 (1)
数据结构串的基本操作及应用实验报告
实验日期2010.5.10 教师签字成绩实验报告【实验名称】第四章串的基本操作及应用【实验目的】1、熟悉将算法转换成程序代码的过程。
2、了解串的逻辑结构特性,熟练掌握串顺序存储结构的C 语言描述方法。
3、熟练掌握串的基本操作:求长度、串的连接、插入、删除等,掌握串的存取特性。
【实验原理】1.串可以可以有三种存储方式,分别为顺序存储、堆分配存储、链式存储,串的基本操作在这三种存储方式下操作。
2.串的模式匹配KMP算法在每一趟匹配过程中出现字符不等时,不需回溯指针,而是利用已经得到的部分匹配结果的结果将模式向右滑动尽可能远的一段距离,继续进行比较。
【实验内容】1.串的顺序存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)#include<stdio.h>#include<iostream.h>#include<malloc.h>#include<string.h>#define SIZE 20struct HString{char ch[SIZE];int length;};void StrInsert(HString &s,int pos,HString t){int i,j;if(pos<1||pos>s.length+1)cout<<"ERROR!";if(t.length){for(i=s.length-1;i>=pos-1;--i)s.ch[i+t.length]=s.ch[i];for(j=0;j<=t.length-1;j++)s.ch[pos-1+j]=t.ch[j];s.length+=t.length;}}void StrDelete(HString &s,int pos,int len){int i;int v=pos-1;if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!";for(i=pos+len-1;i<=s.length-1;i++)s.ch[v++]=s.ch[i];s.length-=len;}void StrAssign(HString &t,char chars[]){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.length=0;}else{for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}int StrLen(HString &s){return s.length;}int StrCompare(HString &s,HString t){for(int i=0;i<s.length&&i<t.length;i++){if(s.ch[i]!=t.ch[i])return (int)(t.ch[i]-s.ch[i]);}return s.length-t.length;}void Concat(HString &t,HString s1,HString s2){int i=s1.length+s2.length;for(i=0;i<s1.length;i++)t.ch[i]=s1.ch[i];t.length=s1.length+s2.length;for(i=s1.length;i<t.length;i++)t.ch[i]=s2.ch[i-s1.length];}int SubString(HString &sub,HString s,int pos,int len) {if(pos<1||pos>s.length||len<0||len>s.length-pos+1) {cout<<"ERROR!"<<endl;return 0;}if(!len){sub.length=0;}else{int i=len;for(i=0;i<len;i++)sub.ch[i]=s.ch[pos+i-1];sub.length=len;}}void Display(HString &t){for(int i=0;i<=t.length-1;i++)cout<<t.ch[i];cout<<endl;}void main(){int i;char s[20];do{cout<<"选择您要进行的串的基本操作:"<<endl;cout<<"1.插入"<<endl<<"2.删除"<<endl<<"3.串连结"<<endl<<"4.取子串"<<endl<<"5.串比较"<<endl<<"6.求串长"<<endl<<"7.结束"<<endl;cin>>i;switch(i){case 1:{HString s,t;int pos;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<endl;cout<<"请输入要插入的串t:";cin>>t.ch;StrAssign(t,t.ch);cout<<endl;cout<<"请输入你所要插入的位置:";cin>>pos;StrInsert(s,pos,t);cout<<"插入之后串变为:";Display(s);break;}case 2:{HString s;int pos,len;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入你所要删除串的首位置为:";cin>>pos;cout<<"请输入你需要删除的串的长度:";cin>>len;StrDelete(s,pos,len);cout<<"删除之后串变为:";Display(s);break;}case 3:{HString s1,s2,t;cout<<"请输入串s1:";cin>>s1.ch;StrAssign(s1,s1.ch);cout<<"请输入串s2:";cin>>s2.ch;StrAssign(s2,s2.ch);Concat(t,s1,s2);cout<<"s1与s2合并后的串为:";Display(t);break;}case 4:{HString sub,s;int pos,len;cout<<"请输入主串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入所取原串的起始位置pos:";cin>>pos;cout<<"请输入子串的长度len:";cin>>len;SubString(sub,s,pos,len);cout<<"取出的子串为:";Display(sub);break;}case 5:{HString s,t;int value;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);cout<<"请输入串t:";cin>>t.ch;StrAssign(t,t.ch);value=StrCompare(s,t);if(value>0) cout<<"串s大于串t"<<endl;else if(value==0) cout<<"串s等于串t"<<endl;else cout<<"串s小于串t"<<endl;cout<<endl;break;}case 6:HString s;char *chars;int val;cout<<"请输入串s:";cin>>s.ch;StrAssign(s,s.ch);val=StrLen(s);cout<<"串的长度为:"<<val<<endl;break;case 7:cout<<"操作结束!"<<endl;break;default:cout<<"输入错误!请重新输入!"<<endl;break;}}while(i!=7);}2.串的堆分配存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)#include<stdio.h>#include<iostream.h>#include<malloc.h>#include<string.h>struct HString{char *ch;int length;};void StrInsert(HString &s,int pos,HString t){int i,j;if(pos<1||pos>s.length+1)cout<<"ERROR!";if(t.length){s.ch=(char*)realloc(s.ch,(s.length+t.length)*sizeof(char));for(i=s.length-1;i>=pos-1;--i)s.ch[i+t.length]=s.ch[i];for(j=0;j<=t.length-1;j++)s.ch[pos-1+j]=t.ch[j];s.length+=t.length;}}void StrDelete(HString &s,int pos,int len){int i;int v=pos-1;if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!";for(i=pos+len-1;i<=s.length-1;i++)s.ch[v++]=s.ch[i];s.length-=len;}void StrAssign(HString &t,char *chars){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.ch=NULL;t.length=0;}else{t.ch=(char *)malloc(i*sizeof(char));for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}int StrLen(HString &s){return s.length;}int StrCompare(HString &s,HString t){for(int i=0;i<s.length&&i<t.length;i++){if(s.ch[i]!=t.ch[i])return (int)(t.ch[i]-s.ch[i]);}return s.length-t.length;}void Concat(HString &t,HString s1,HString s2){int i=s1.length+s2.length;t.ch=(char *)malloc(i*sizeof(char));for(i=0;i<s1.length;i++)t.ch[i]=s1.ch[i];t.length=s1.length+s2.length;for(i=s1.length;i<t.length;i++)t.ch[i]=s2.ch[i-s1.length];}int SubString(HString &sub,HString s,int pos,int len){if(pos<1||pos>s.length||len<0||len>s.length-pos+1){cout<<"ERROR!"<<endl;return 0;}if(!len){sub.ch=NULL;sub.length=0;}else{int i=len;sub.ch=(char *)malloc(i*sizeof(char));for(i=0;i<len;i++)sub.ch[i]=s.ch[pos+i-1];sub.length=len;}}void Display(HString &t){for(int i=0;i<=t.length-1;i++)cout<<t.ch[i];cout<<endl;}void main(){int i;char s[20];cout<<"选择您要进行的串的基本操作:"<<endl;do{cout<<"1.插入"<<endl<<"2.删除"<<endl<<"3.串连结"<<endl<<"4.取子串"<<endl<<"5.串比较"<<endl<<"6.求串长"<<endl<<"7.结束"<<endl;cin>>i;switch(i){case 1:{HString s,t;char a[20],b[20];char *sa,*sb;int pos;cout<<"请输入串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<endl;cout<<"请输入要插入的串t:";cin>>b;sb=b;StrAssign(t,sb);cout<<endl;cout<<"请输入你所要插入的位置:";cin>>pos;StrInsert(s,pos,t);cout<<"插入之后串变为:";Display(s);break;}case 2:{HString s;char str[20];char *chars;int pos,len;cout<<"请输入串s:";cin>>str;chars=str;StrAssign(s,chars);cout<<"请输入你所要删除串的首位置为:";cin>>pos;cout<<endl;cout<<"请输入你需要删除的串的长度:";cin>>len;cout<<endl;StrDelete(s,pos,len);cout<<"删除之后串变为:";Display(s);break;}case 3:{HString s1,s2,t;char a[20],b[20];char *sa,*sb;cout<<"请输入串s1:";cin>>a;sa=a;StrAssign(s1,sa);cout<<"请输入串s2:";cin>>b;sb=b;StrAssign(s2,sb);Concat(t,s1,s2);cout<<"s1与s2合并后:";Display(t);break;}case 4:{HString sub,s;char a[20];char *sa;int pos,len;cout<<"请输入主串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入所取原串的起始位置pos:";cin>>pos;cout<<"请输入子串的长度len:";cin>>len;SubString(sub,s,pos,len);cout<<"该子串为:";Display(sub);break;}case 5:{HString s,t;int value;char a[20],b[20];char *sa,*sb;cout<<"请输入串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入串t:";cin>>b;sb=b;StrAssign(t,sb);value=StrCompare(s,t);if(value>0) cout<<"串s大于串t"<<endl;else if(value==0) cout<<"串s等于串t"<<endl;else cout<<"串s小于串t"<<endl;cout<<endl;break;}case 6:HString s;char str[20];char *chars;int val;cout<<"请输入串s:";cin>>str;chars=str;StrAssign(s,chars);val=StrLen(s);cout<<"串的长度为:"<<val<<endl;break;case 7:cout<<"操作结束!"<<endl;break;default:cout<<"输入错误!请重新输入!"<<endl;break;}}while(i!=7);3.KMP算法的C实现#include<iostream.h>#include<malloc.h>#include<string.h>struct HString{char *ch;int length;};void StrAssign(HString &t,char *chars){int i;char *c;for(i=0,c=chars;*c;++i,++c);if(!i){t.ch=NULL;t.length=0;}else{t.ch=(char *)malloc(i*sizeof(char));for(int j=0;j<i;j++)t.ch[j]=chars[j];t.length=i;}}void get_next(HString s,int next[]){int i,j;i=1;j=0;next[1]=0;while(i<s.length){if(j==0||s.ch[i-1]==s.ch[j-1]){i++;j++;next[i]=j;}else j=next[j];}for(i=1;next[i]!='\0';i++)cout<<next[i]<<" ";}int Index(HString s,HString t,int pos){int i=pos;int j=1;int next[20];get_next(t,next);while(i<=s.length&&j<=t.length){if(s.ch[i-1]==t.ch[j-1]||j==0){ ++i;++j;}else{j=next[j];}}if(j>t.length)return i-t.length;else return 0;}void Display(HString t){for(int i=0;i<t.length;i++)cout<<t.ch[i];cout<<endl;}void main(){ HString s,t;int pos,k;char a[20],b[20];char *sa,*sb;cout<<"请输入主串s:";cin>>a;sa=a;StrAssign(s,sa);cout<<"请输入模式串t:";cin>>b;sb=b;StrAssign(t,sb);cout<<"请输入起始位置pos:";cin>>pos;k=Index(s,t,pos);if(k==0)cout<<"匹配失败!"<<endl<<endl;else{cout<<"从第"<<k<<"个位置开始匹配"<<endl;Display(s);for(int i=1;i<k;i++)cout<<" ";Display(t);}}【小结讨论】1. 此程序关键在于位置查询,由于对C语言函数的陌生导致问题变的繁琐,自己的C语言水平有待提高。
数据结构第5章 串和广义表
5.1 串的定义和基本运算
• (4)串的连接StrCat(S,T)。 • 初始条件:串S和T存在。 • 操作结果:将串T的值连接在串S的后面。 • (5)求子串SubString(Sub,S,pos,len)。 • 初始条件:串S存在,1≤pos≤StrLength(S)且
1≤len≤StrLength(S)-pos+1。 • 操作结果:用Sub返回串S的第pos个字符起长度为len的
1≤len≤StrLength(S)-pos+1。 • 操作结果:从串S中删除第pos个字符起长度为len的子串。 • (9)串的替换StrReplace(S,T,V)。 • 初始条件:串S,T和V存在,且T是非空串。 • 操作结果:用V替换串S中出现的所有与T相等的不重叠子
串。 • (10)判断串空StrEmpty(S)。 • 初始条件:串S存在。 • 操作结果:若串S为空串,则返回1;否则返回0。
• (1)非紧凑存储。设串S="Hello boy",计算机字长为32 位(4个Byte),用非紧凑格式一个地址只能存一个字符, 如图5-2所示。其优点是运算处理简单,但缺点是存储空 间十分浪费。
• (2)紧凑存储。同样存储S="Hello boy",用紧凑格式一 个地址能存四个字符,如图5-3所示。紧凑存储的优点是 空间利用率高,缺点是对串中字符处理的效率低。
•}
5.3 串的基本运算的实现
• (3)求子串操作。求串S从第pos位置开始,长度为len的 子串,并将其存入到串Sub中。操作成功返回1,不成功 返回0。其算法描述如下:
• int SubString(String *S,String *Sub,int pos,int len)
数据结构答案 第5章 串学习指导
第5章串5.1 知识点分析1.串的定义串(String)是由零个或多个任意字符组成的有限序列。
一般记作:s="a1 a2 …a i…a n"。
其中s 是串名,用双引号括起来的字符序列为串值,但引号本身并不属于串的内容。
a i(1<=i<=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号;n为串的长度,表示串中所包含的字符个数。
2.几个术语(1)长度串中字符的个数,称为串的长度。
(2)空串长度为零的字符串称为空串。
(3)空格串由一个或多个连续空格组成的串称为空格串。
(4)串相等两个串相等,是指两个串的长度相等,且每个对应字符都相等。
(5)子串串中任意连续字符组成的子序列称为该串的子串。
(6)主串包含子串的串称为该子串的主串。
(7)模式匹配子串的定位运算又称为串的模式匹配,是一种求子串的第一个字符在主串中序号的运算。
被匹配的主串称为目标串,子串称为模式。
3.串的基本运算(1)求串长:LenStr(s)。
(2)串连接:ConcatStr(s1,s2) 。
(3)求子串:SubStr (s,i,len)。
(4)串比较:EqualStr (s1,s2)。
(5)子串查找:IndexStr (s,t),找子串t在主串s中首次出现的位置(也称模式匹配)。
(6)串插入:InsStr (s,t,i)。
(7)串删除:DelStr(s,i,len)。
4.串的存储(1)定长顺序存储。
(2)链接存储。
(3)串的堆分配存储。
5.2 典型习题分析【例1】下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储分析:空串是不含任何字符的串,即空串的长度是零。
空格串是由空格组成的串,其长度等于空格的个数。
答案为B。
【例2】两个串相等的充分必要条件是( )。
A.两个串长度相等B.两个串有相同字符C.两个串长度相等且有相同字符D.以上结论均不正确分析:根据串相等定义,两个串是相等是指两个串的长度相等且对应字符都相等,故A、B、C均不正确,答案为D。
数据结构第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;
数据结构第五章习题
数据结构第五章习题1.名词解释(1)串(2)广义表2.判断题〔以下各题,正确的请在前面的括号内打√,错误的打×〕〔〕〔1〕串中不可以包含空白字符。
〔〕〔2〕两个串相等必有串长度相同。
〔〕〔3〕两个串相等那么各位置上的字符不一定对应相同。
〔〕〔4〕串的长度不能为零。
〔〕〔5〕子串是主串中字符构成的有限序列。
〔〕〔6〕串是一种特殊的线性表。
〔〕〔7〕空格串是由一个或多个空格字符组成的串,其长度为1。
〔〕〔8〕广义表最大子表的深度为广义表的深度。
〔〕〔9〕广义表不能递归定义。
〔〕〔10〕广义表的组成元素可以是不同形式的元素。
3.填空题(1)串中字符的个数称为串的____________。
(2)不含有任何字符的串称为____________,它的长度是____________。
(3)串的___________就是把串所包含的字符序列,依次存入连续的存储单元中去。
(4)串的链式存储结构是将存储区域分成一系列大小相同的节点,每个节点有两个域:____________域和____________域。
其中____________域用于存储数据,____________域用于存储下一个节点的指针。
(5)子串的定位操作通常称为串的____________。
(6)串的两种最根本的存储方式是____________和____________。
(7)广义表((a), ((b), c), (((d))))的表头是____________,表尾是____________。
(8)广义表的表尾总是一个____________。
4.选择题(1)串是一种特殊的线性表,其特殊性表达在〔〕。
A.可以顺序存储B.数据元素是一个字符C.可以链接存储D.数据元素可以任意(2)串的长度是〔〕。
A.串中不同字母的个数B.串中不同字符的个数C.串中所含字符的个数且大于零D.串中所含字符的个数(3)空串与空格串〔〕。
A.相同B.不相同C.可能相同D.无法确定(4)求字符串T在字符串S中首次出现的位置的操作为〔〕。
数据结构中的串
StrCompare(S, T) : 若S>T 返回>0;若S=T 返回=0;若
S<T 返回<0;
StrLength( S ) :串S存在,返回S中元素的个数,称为串
的长度
more
串的基本操作
Concat( &T, S1,S2 ) : 用T返回S1和S2联接而成的新串 SubString( &Sub,S,pos,len ) : 用Sub返回串S的第pos个
▪ 两个串之间可以进行比较。 ▪ 称两个串相等,当且仅当这两个串的值相等,包括
两个串的长度相等,并且各个对应位置的字符都相 等。
▪ 当两个串不相等时,可按“字典顺序”分大小。令
s= “s0s1…sm-1” (m>0) t= “t0t1…tn-1” (n>0) ▪ 假设,两者最大有前k个子序列相等(最大相等前缀子
▪ 串中任意个连续的字符组成的子序列称为该串的子串。包含 子串的的串相应地称为主串。通常称字符在序列中的序列号 为该字符在串中的位置。子串在主串中的位置则以子串第0 个字符在主串的位置来表示。
4.1 串的定义和操作
▪ 例如:下面a,b,c,d都是串
▪ a=“BEI”
长度为3
▪ b=“JING”
长度为4
44
第4章 串
数据结构的串操作
数据结构的串操作数据结构的串操作
⒈概述
⑴串的定义
⑵串的基本操作
⒉串的存储结构
⑴顺序存储结构
⑵链式存储结构
⒊串的基本操作
⑴串的长度
⑵串的比较
⑶串的连接
⑷串的截取
⑸串的插入
⑹串的删除
⑺串的替换
⒋字符串匹配算法
⑴朴素模式匹配算法
⑵ KMP 算法
⑶ Boyer-Moore 算法
⑷ Rabin-Karp 算法
附件:
⒈示例代码
⒉数据集
法律名词及注释:
⒈串:在计算机科学中,串(String)是由零个或多个字符组成的有限序列。
⒉顺序存储结构:串的顺序存储结构是将串的字符按线性次序逐个存储在一组地址连续的存储单元里。
⒊链式存储结构:串的链式存储结构是通过定义一个节点类型来存储串的字符,每个节点包含一个字符和一个指向下一个节点的指针。
⒋朴素模式匹配算法:朴素模式匹配算法是最简单的字符串匹
配算法之一,通过对目标串的每个字符依次与模式串进行比较,直
到找到匹配的位置或遍历完所有字符。
⒌ KMP 算法:KMP 算法是一种高效的字符串匹配算法,通过利
用模式串的前缀和后缀信息,在匹配失败时将模式串移动比朴素算
法更远的位置,减少比较次数。
⒍ Boyer-Moore 算法:Boyer-Moore 算法是一种基于多种规则
的字符串匹配算法,通过从右到左比较模式串和目标串的字符,根
据不匹配字符在模式串中的位置和字符表进行移动,提高匹配效率。
⒎ Rabin-Karp 算法:Rabin-Karp 算法是一种利用哈希函数的
字符串匹配算法,通过计算目标串和模式串的哈希值,并逐个比较,减少比较次数。
数据结构(串)
数据结构(串)数据结构(串)数据结构中的串(String)是由字符构成的有限序列。
在计算机科学中,串是一种基本的数据结构,被广泛应用于字符串处理、文本搜索、模式匹配等领域。
1. 串的定义和基本操作串可以使用多种方式来定义和表示,常见的方式有:- 定长顺序存储表示:使用数组来存储串,数组的长度和最大串长相等,不足的部分用特定字符填充(通常用空格)。
- 堆分配存储表示:使用堆(动态内存分配区)来存储串,可以根据实际需要动态分配和释放串的存储空间。
- 串的块链存储表示:将串分成多个块,将每个块使用链表进行表示,将各块在一起组成完整的串。
串的基本操作包括:- 串的赋值:将一个串赋值给另一个串。
- 串的连接:将两个串按顺序连接成一个新的串。
- 串的比较:比较两个串的大小关系。
- 串的截取:从一个串中截取出一段子串。
- 串的插入:将一个串插入到另一个串的指定位置。
- 串的删除:删除一个串中指定位置的字符或一段子串。
- 串的替换:将一个串中指定位置的字符或一段子串替换成另一个串。
2. 串的匹配算法串的匹配是指在一个主串中查找一个模式串的过程。
常见的串匹配算法包括:- 朴素匹配算法:也称为暴力匹配算法,是最简单的匹配算法。
它从主串的第一个字符开始,与模式串逐个字符进行比较,若不匹配,则主串向后移动一位,直到找到匹配的子串或主串遍历完。
- KMP算法:即Knuth-Morris-Pratt算法,通过利用模式串自身的信息,减少字符的比较次数。
该算法具有线性时间复杂度,是一种高效的匹配算法。
- Boyer-Moore算法:基于模式串中的字符发生不匹配时的启发式策略,通过跳跃式地移动模式串,减少字符的比较次数,从而提高匹配效率。
3. 串的应用串作为一种基本的数据结构,在实际应用中具有广泛的用途,主要包括以下几个方面:- 字符串处理:串在文本编辑、编译器设计、语法分析、文件操作等方面都有广泛应用。
- 模式匹配:串的匹配算法常被用于字符串搜索、DNA序列分析、信息检索等领域。
数结_5串
原子运算不能用其他运算的组合来实现,构成了串
运算的最小子集。
14:51:43
串 串的定义
例:用原子运算的组合实现插子串StringInsert
Status StringInsert(String &S, int pos, String T) {
String s1, s2;
n=StringLength(S);
14:51:43
//匹配成功,返回子串的位置
//S中不存在与T相等的子串
void Replace(String &S, String T, String V) { int start=1, m=StrLength(T), n=StrLength(V), pos; String temp; StrAssign(temp , ‘ ’); while(pos=Index(S, T, start) != 0 && start<=n){ SubString(sub, S, start, pos-1); Concat(temp, temp, sub); Concat(temp, temp, V); start+=pos+m; } //while SubString(sub, S, start, n-start+1) Concat(temp, temp, sub) StrCopy(S, temp); } 14:51:43 //Replace
14:51:43
串 串表示与实现 定长顺序存储
想一想:
能否通过放大静态数组的空间(>256)来 扩大串的最大串长?
14 I
0 1 2
a m
3 4 5
a
6 7
s
数据结构串的实验报告
一、实验目的1. 理解串的定义、性质和操作;2. 掌握串的基本操作,如串的创建、复制、连接、求子串、求逆序、求长度等;3. 熟练运用串的常用算法,如串的模式匹配算法(如KMP算法);4. 培养编程能力和算法设计能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 串的创建与初始化2. 串的复制3. 串的连接4. 串的求子串5. 串的求逆序6. 串的求长度7. 串的模式匹配算法(KMP算法)四、实验步骤1. 串的创建与初始化(1)创建一个串对象;(2)初始化串的长度;(3)初始化串的内容。
2. 串的复制(1)创建一个目标串对象;(2)使用复制构造函数将源串复制到目标串。
3. 串的连接(1)创建一个目标串对象;(2)使用连接函数将源串连接到目标串。
4. 串的求子串(1)创建一个目标串对象;(2)使用求子串函数从源串中提取子串。
5. 串的求逆序(1)创建一个目标串对象;(2)使用逆序函数将源串逆序。
6. 串的求长度(1)获取源串的长度。
7. 串的模式匹配算法(KMP算法)(1)创建一个模式串对象;(2)使用KMP算法在源串中查找模式串。
五、实验结果与分析1. 串的创建与初始化实验结果:成功创建了一个串对象,并初始化了其长度和内容。
2. 串的复制实验结果:成功将源串复制到目标串。
3. 串的连接实验结果:成功将源串连接到目标串。
4. 串的求子串实验结果:成功从源串中提取了子串。
5. 串的求逆序实验结果:成功将源串逆序。
6. 串的求长度实验结果:成功获取了源串的长度。
7. 串的模式匹配算法(KMP算法)实验结果:成功在源串中找到了模式串。
六、实验总结通过本次实验,我对串的定义、性质和操作有了更深入的了解,掌握了串的基本操作和常用算法。
在实验过程中,我遇到了一些问题,如KMP算法的编写和调试,但在老师和同学的指导下,我成功地解决了这些问题。
5串
int leng()=0; //求长度 int pos(char* t,int k=0)=0; //定位 char* subs(int pos,int len)=0;//求子串 Str& inst(int pos,char* t)=0; //插入 Str& dele(int pos,int len)=0; //删除 Str& repl(char* t,char* r)=0; //替换
10
str1类的构造函数
Str1(int sz=81) { curlen=0; maxlen=sz; str=new char[maxlen]; }; Str1(char *s) { curlen=strlen(s); maxlen=curlen+1; str=new char[maxlen]; strcpy(str,s);}; Str1(Str1& s) { curlen=s.curlen; maxlen=s.maxlen; str=new char[maxlen]; strcpy(str,s.str);};
数据结构串
朱振元
1 版权所有, 1997 (c) Dale Carnegie & Associates, Inc.
串的初步认识
串(字符串)被定义为由零个或多个字符组成的有限 序列。记为:
s = „a1 a2 … an‟
(n >=0)
其中,s是串的名,也称为串变量。单引号内的字符序 列为串值;ai (1≤i≤n)可以是字母、数字或其它 字符。 例如: a = „Data‟ c = „DataStructure‟ b = „Structure‟ d = „Data Structure‟
4
基本操作的例
数据结构专项精讲课程讲义-第三部分-第5章 串
1.下面关于串的的叙述中,哪一个是不正确的?( E )A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行concat(replace (S1,substr (S1,length(S2), length(S3)), S3),substr(S4,index(S2,‘8’),length(S2)))其结果为(E )A.ABC###G0123 B.ABCD###2345 C.ABC###G2345D.ABC###2345 E.ABC###G1234 F.ABCD###1234G.ABC###012343.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为(C)。
A.求子串B.联接C.匹配D.求串长4.已知串S=‘aaab’,其Next数组值为(A )。
A.0123 B.1123 C.1231 D.12115.串‘ababaaababaa’的next数组为(C )。
A.012345678999 B.012121111212C.011234223456 D.01230123223456.字符串‘ababaabab’的nextval 为(A)。
A.(0,1,0,1,04,1,0,1) B.(0,1,0,1,0,2,1,0,1)C.(0,1,0,1,0,0,0,1,1) D.(0,1,0,1,0,1,0,1,1 )7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为(D ), nextval数组的值(F)。
A.0 1 1 1 2 2 1 1 1 2 3 4 5 6 7 1 2B.0 1 1 1 2 1 2 1 1 2 3 4 5 6 1 1 2C.0 1 1 1 0 0 1 3 1 0 1 1 0 0 7 0 1D.0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2E.0 1 1 0 0 1 1 1 0 1 1 0 0 1 7 0 1F.0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 18.若串S=‘software’,其子串的数目是(B )。
数据结构之串类型
数据结构之串类型 串的基本概念: 串(字符串):是零个或多个字符组成的有限序列。
记作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是单个,可以是字母、数字或其它字符。
串值:双引号括起来的字符序列是串值。
串长:串中所包含的字符个数称为该串的长度。
空串(空的字符串):长度为零的串称为空串,它不包含任何字符。
空格串(空⽩串):构成串的所有字符都是空格的串称为空⽩串。
注意:空串和空⽩串的不同,例如“ ”和“”分别表⽰长度为1的空⽩串和长度为0的空串。
⼦串(substring):串中任意个连续字符组成的⼦序列称为该串的⼦串,包含⼦串的串相应地称为主串。
⼦串的序号:将⼦串在主串中⾸次出现时的该⼦串的⾸字符对应在主串中的序号,称为⼦串在主串中的序号(或位置)。
特别地,空串是任意串的⼦串,任意串是其⾃⾝的⼦串。
串相等:如果两个串的串值相等(相同),称这两个串相等。
换⾔之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。
通常在程序中使⽤的串可分为两种:串变量和串常量。
串的抽象数据类型定义: ADT String{ 数据对象:D = { ai|ai∈CharacterSet, i=1,2,…,n, n ≥0 } 数据关系:R = {<ai-1, ai>| ai-1, ai∈D, i=2,3,…,n } 基本操作: StrAssign(t , chars) 初始条件: chars是⼀个字符串常量。
操作结果:⽣成⼀个值为chars的串t 。
StrConcat(s, t) 初始条件:串s, t 已存在。
操作结果:将串t联结到串s后形成新串存放到s中。
StrLength(t) 初始条件:字符串t已存在。
操作结果:返回串t中的元素个数,称为串长。
SubString (s, pos, len, sub) 初始条件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。
数据结构串的知识点归纳
数据结构串的知识点归纳数据结构串是一种线性表结构,它是由零个或多个数据元素组成的有限序列。
数据结构串的存储结构有两种:顺序存储结构和链式存储结构。
下面将从串的定义、顺序存储结构、链式存储结构、串的基本操作等几个方面进行详细介绍。
一、串的定义串是由零个或多个字符组成的有限序列。
在串中,字符的个数称为串的长度。
如果串的长度为0,则称为空串。
串中的字符可以是字母、数字、标点符号和其他特殊符号等。
二、顺序存储结构顺序存储结构是将串中的字符按照其在串中的顺序依次存放在一块连续的存储空间中。
在顺序存储结构中,我们可以使用一维数组来表示串。
数组的下标表示字符在串中的位置,数组的元素存储字符的ASCII码值或字符本身。
通过这种方式,我们可以方便地对串进行插入、删除、查找等操作。
三、链式存储结构链式存储结构是将串中的字符按照其在串中的顺序分别存放在一系列结点中,并通过指针将这些结点链接起来。
在链式存储结构中,我们可以使用单链表、双链表或循环链表等数据结构来表示串。
每个结点包含一个字符和一个指向下一个结点的指针。
通过这种方式,我们可以方便地对串进行插入、删除、查找等操作。
四、串的基本操作1. 串的赋值:将一个串赋值给另一个串,即将被赋值串的字符复制给另一个串。
2. 串的连接:将两个串连接成一个新串,即将一个串的字符依次复制到另一个串的后面。
3. 串的比较:比较两个串是否相等或大小关系。
4. 串的求子串:从一个串中截取一段连续的子串。
5. 串的插入:将一个串插入到另一个串的指定位置。
6. 串的删除:从一个串中删除指定位置的字符或一段连续的子串。
7. 串的替换:将一个串中的子串替换为另一个串。
8. 串的查找:在一个串中查找指定字符或子串的位置。
9. 串的长度:获取一个串的长度。
10. 串的清空:将一个串清空,使其变成空串。
五、应用场景串作为一种基本的数据结构,在实际应用中有着广泛的应用场景。
例如,字符串匹配算法中常用的KMP算法和Boyer-Moore算法,都是基于串的操作实现的。
数据结构-串PPT课件
拉里·佩奇(Larry Page)
• Google搜索引擎源于拉里·佩奇和谢尔盖·布林在斯坦福大学读书时所做的一个研究项目。他们 最开始是在佩奇简陋的宿舍搞研究。
• 1996年初,佩奇和布林开始合作研究一名为“BackRub”的搜索引擎,到1998年上半年逐步 完善这项技术后,两人开始为这项技术寻找合作伙伴。他们找到雅虎的创始人之一戴维·菲洛。 菲洛认为他们的技术确实很可靠,但建议他们自己建立一个搜索引擎公司发展业务,发展起来 后再考虑合作。
a
17
2. 串的定义
由零个或多个字符组成的有限序列.
一般记为:s= a1a2…an ,n>=0
❖ 串名:s => 变量名 => 字符串 ❖ 串值: a1a2…an
=〉空格串: a1,a2,…,an 均为空格 ❖ 串长:n => n=0 =〉空串 空格串不同于空串
a
18
➢ 子串:串中任意个连续的字符组成的 子序列 =〉原串:主串
a
28
StrLength (S)
初始条件:串 S 存在。 操作结果:返回 S 的元素个数,
称为串的长度。
注:空格在串中占一个位置, 其长度为1。
a
29
Concat (&T, S1, S2)
初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2
联接而成的新串。
例如: Concat( T, man, kind) 求得 T = mankind
构建倒排文件 文档 1 文档 2 … 文档 1 文档 5 …
实验室
文档1 文档 2 …
第四章
串
a
15
4.1 串的相关术语 4.2 串的抽象数据类型的定义 4.3 串的表示和实现 4.4 串的模式匹配算法
数据结构-第四章串
数据结构-第四章串串也叫字符串,它是由零个或多个字符组成的字符序列。
基本内容1 串的有关概念串的基本操作2 串的定长顺序存储结构,堆分配存储结构;3 串的基本操作算法;4 串的模式匹配算法;5 串操作的应⽤。
学习要点1 了解串的基本操作,了解利⽤这些基本操作实现串的其它操作的⽅法;2 掌握在串的堆分配存储结构下,串的基本操作算法;3 掌握串的模式匹配算法;第四章串 4.1 串的基本概念4.2 串存储和实现4.3 串的匹配算法4.4 串操作应⽤举例第四章串 4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例第四章串4.1 串的基本概念 4.2 串存储和实现 4.3 串的匹配算法 4.4 串操作应⽤举例4. 1 串类型的定义⼀、串的定义1 什么是串串是⼀种特殊的线性表,它是由零个或多个字符组成的有,a2, a3, ... a n’限序列,⼀般记作s = ‘a1其中 s----串名, a1,a2, a3, ... a n----串值串的应⽤⾮常⼴泛,许多⾼级语⾔中都把串作为基本数据类型。
在事务处理程序中,顾客的姓名、地址;货物的名称、产地。
可作为字符串处理,⽂本⽂件中的每⼀⾏字符等也可作为字符串处理。
下⾯是⼀些串的例⼦:(1)a = ‘ LIMING’(2)b = ‘NANJING UNIVERSITY OF SCIENCE &TECHNOLOGY’(3)c = ‘ DATA STRUCTURE’(4)d = ‘’说明:1) 串中包含的字符个数,称为串的长度。
长度为0的串称为空串,它不包括任何字符,上⾯(4)中的串d 是空串,(5)中的e 是包含⼀个空格符的空格串;2)串中所包含的字符可以是字母、数字或其他字符,这依赖于具体计算机所允许的字符集。
2 串的有关术语1)⼦串串中任意连续的字符组成的⼦序列称为该串的⼦串例:c = ‘ DATA STRUCTURE’,f=‘DATA’ f是c的⼦串2)⼦串的位置⼦串T 在主串S中的位置是指主串S中第⼀个与T相同的⼦串的⾸字母在主串中的位置。
(完整版)数据结构课后习题答案
第1章绪论1 •简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,士1,士2,…},字母字符数据对象是集合C={ ‘ A', ‘ B…,‘ Z,‘ a'b ',…,‘ z ' },学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
2 •试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。
答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。
每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 3.串连接 void ConcatStr(SeqString *r1,seqString *r2〉
{if(r1->len+r2->len>MAXLEN) /*连接后的串长超过串的最大长度*/
printf("两个串太长,溢出!“);
else
{for(i =0 ;i<r2->len;i++)
r1-> str[r1->len+i]=r2->str[i] /*进行连接*/
上述这些运算对串而言都是一些最基本的 操作,因此,在引进串变量的高级语言中,一般 都将上述操作作为基本运算符或内部函数或 过程提供,程序开发人员可以直接使用这些操 作来实现程序功能。当然不同语言所提供的 上述操作的种类和标识符可能有所不同。
4.2串的存储结构与运算
串本身是一种线性表,所以串的存储方法与线
4.1.1串的基本概念
• 1.串
• 串(string)是零个或多个字符组成的有限序列,也可 以称为字符串。一般记为S=“a1a2a3…an”。其中 S是串名,双引号括起的字符序列是串值;将串值括 起来的双引号本身不属于串的一部分,它的作用是 避免串与常数或与标识符混淆。例“123”是数字 字符串,而123则是整型常数;“xl”是长度为2的字符 串,而xl通常作为某个对象(如变量、数组或函数等) 的同标的识机符 器来 和使 语用 言。版每本个对合ai(法1<字=i<符=(n即)是允一许个使字用符的,不字 符)有不同的规定。但是一般情况下,英文字符、数 字(0,1,2,…,9)和常用的标点符号以及空格符等都 是合法字符。
• 6.Strcompare(S1, S2) 比较两个字符串S1和S2的大小。若S1>S2,则返
回1;若S1=S2,则返回0;否则返回-1。假设 S1=“abc”,S2=“acd”,则strcompare(S1,Sz)=-1;若 Sl=“aaa”,S2=“aaa”,则strcompare(S1,Sz)=0;若 S1="bbb",S2="aaa",则Strcompare(S1,S2)返回1. • 7.Strconeat(S1, S2)
if(ri->str[i]!=r2->str[i])
return (r);
retum(r1->len - r2->lenh
/*相等返回
0*/
6.插入子串
7.删除字串
• 串的存储空间的大小在编译时刻就已确定, 是静态的,在执行插入或者两个字符串连接 操作时,如果最终长度超过目标字符串的存 储空间大小,则会产生“溢出”,这是定长顺 序存储的一个弊病。
例如,若S =“abcdef”,i =3,lea =2,则Substring (S,3,2)="cd";若S="abc",i=4,len=2,则出错。
• 9.Index(P,T)
寻找字符串P在字符串T中首次出现的起始位置。例如, 若T=”abcdefg“, P=“bcd”则Index(P,T)=2;若P=“bbd“,此时P 没有在T中出现,因此Index(P,T)=0.
4.1.1串的基本概念
• 2.空串和空白串
含零个字符的串称为空串,用¢表示。其它 串称为非空串。任何串中所含字符的个数
称为该串的长度(或串长)。空串的长度为0,它 不包含任何字符。由一个或多个空格组成的 串称为空白串(blank string),它的长度为串中 空格的个数,它是一个仅含空格符的非空串。 注意:空串和空白串的不同,例如""和“ "分别 表示长度为0的空串和长度为1的空格串。
• 3.Strlength(S ) 求变量S中存放的字符串的长度。例如,若
S=“abc”,则Strlength(S)=3;若S=¢( ¢ ) 表示空串),则Strlength(S)=0。
• 4.Strempty(S) 判断变量S中存放的字符串是否为空串。
若是空串,则返回1;否则,返回0。
• 5.Strclear(S) 若字符串S是存在的,则该操作将它清空。
性表的存储方法类似。由于线性表有两种基本存 储结构:顺序存储和链式存储,因此字符串也有同 样两种基本存储结构。但是,串本身又是一种特殊 的线性表,其特殊之处在于:串的每个结点只含一 个字符,若要提高存储密度(即存储结点中数据域占 用的存储量与整个存储结点用的存储量之比),则 需作出特殊的考虑。
串的常见存储结构有顺序存储结构和链式存 储结构,串的顺序存储结构简称为顺序串,顺序串又 可按存储分配方式的不同分为静态存储分配(又称 为定长顺序存储)和动态存储分配(又称为堆分配 存储)。
4.1串的定义
• 串(又称字符串)是一种特殊的线性表,它的特 殊之处在于:线性表的每个元素结点仅由一 个字符组成。在早期的程序设计语言中,串 仅在输入或输出中以常量的形式出现,并不 参与运算,因而只需存储此串的串值,即字符 序列即可。随着计算机的发展,串在文字编 辑、词法扫描、符号处理以及定理证明等 许多领域得到越来越广泛的应用。在高级 语言中开始引入了串变量的概念,如同整型、 实型变量一样,串变量也可以参加各种运算。
r1->str[r1->len+i]='\0’; r1->len=r1->len+r2->len; /*修改连接后新 串的长度*/
4.求字串
5.串相等的比较
int EqualStr(SeqString *rl,SeqString *r2)
{int i;
For( i=0 ; i<r1-> len && i<r2->len; i++);
空串是任意串的子串,任意串是其自身的子串。
4.1.1串的基本概念
4.串相等 两个串是相等的,当且仅当它们的长度相等
并且各个对应位置上的字符都相同。
4.1.2串的基本运算
串的逻辑结构和线性表极为相似,区别仅在 于串的数据对象为字符集。然而,串的基本操作 和线性表却有很大差别。在线性表的基本操作 中,大多以“单个元素”作为操作对象,如在线 性表中查找某个元素、求取某个元素、在某个 位置上插入一个元素和删除一个元素等;而在 串的基本操作中,通常以“串的整体”作为操作 对象,如在串中查找某个子串、求取一个子串、 在串的某个位置上插入一个子串以及删除一个 子串等。下面列出一些与串相关的基本本操作。
4.1.1串的基本概念
3.子串和主串 串中任意个连续字符组成的子序列称为该串的
子串。包含子串的串相应地称为主串。通常称字符 在序列中的序号为该字符在串中的位置。子串在主 串中的位置则以子串的第一个字符在主串中的位置 来表示。 例如,设A、B、C、D为如下的4个串z:A="BEI", B ="JING",C="BEIJING",D="BEI-JING"。 则它们的长度分别为3、4、7和8,并且A和B都是C和 D的子串,A在C和D中的位置都是1,而B在C中的位置 是4,在D中的位置是5。
• 1.Strcreate(S )
初始化字符串。该操作产生.一个新的 字符串放入字符串变量S中,在不支持字符串 变量的编程语言中,可将S定义为字符指针 (下同),该操作使得S指向生成的新字符串的 首地址。
• 2.Strassign(S,T)
字符串赋值操作。其中S和T均为字符串 变量,该操作将字符串变量T中存放的值赋给 S。例如,若T=“abc”,则执行Strassign后,S 中的值也为“abc”。
• 10.Strinsert(S, i, T)
字符串的插入运算。表示将字符串T插入到字符串S的第i 个字符之前。例如,S=”abcdef",i=4,T="kk",则执行插入操 作后,S的值变成"abckkdef"。
• 11.Strdelete(S,i,len)
t字符串的删除运算。表示将字符串S中第i个字符开始长 度为len的子串删除。例:S=“abcdefg”,i=3,len=3,则执 行Strdelete后,S="abfg"。
字符串的连接操作。它将S2中存放的字符串连接 到S1中存放的字符串的后面构成一个新串返回。例 如,S1=“abc”,S2=“cd”,则Strconeat(S1,S2)=“abed”。 • 8.Substring(S,i,len)
该操作的功能为求S的子串。在字符串S中,从第i 个字符开始取len个连续字符构成一个子串返回。
• 除直接使用定长的字符数组存放串内容外, 一般可使用一个不会出现在串中的特殊字 符放在串值的末尾来表示串的结束。所以 串空间最大值为MaxStrSize时,最多只能放 MaxStrSize-1个字符。例如在C语言中是以 字符‘\0'表示串值的终结。
4.2.2串的堆分配存储
顺序串的字符数组空间可使用C语言的malloc和 free等动态存储管理函数,根据实际需要动态地分 配和释放。在程序执行过程中,利用标准函数 malloc和free动态地分配或释 放存储字符串的存储单元,并以一个特殊的字符作为 字符串的结束标志,它的好处在于:可以根据具体情 况,灵活地申请适当数目的存储空间,从而提高存储 资源的利用率。
• 1.创建字符串 seqString *Cseatestr( Seqstring *S) {gets(s -> str); s ->1en=Lenstr(s); return s; }
• 2.求串的长度 int Lenstr(SeqString *S) {int i=0; while(s->str[i]!='\0') i++; return i; }
通常,C语言中提供的串类型就是以这种存储方 式实现的。系统利用函数malloc()和free()进行串 值空间的动态管理,为每一个新产生的串分配一个 存储区,称串值共享的存储空间为"堆"。C语言中 的串以一个空字符为结束符,串长是一个隐含值。 类型定义如下所示: