1、实验三 串基本操作的实现实验三 串基本操作的实现【实验课程名称】数据结构【实验项目名称】串基本操作的实现【实验目的】1 理解定长顺序串的存储结构及基本操作的定义2 掌握定长顺序串的基本操作;3 学会设计实验数据验证程序。【实验仪器及环境】计算机,window xp操作系统,VC+6.0【实验内容及步骤】1. 存储结构定义: define MAXSTRLEN 255 /串的长度最大为255 typedef unsigned char SStringMAXSTRLEN+1; /0号单元存放串的长度,其最大值刚好是2552. 实现的基本操作:StrAssign (&T, chars)初始条件:cha
2、rs 是串常量。操作结果:赋于串T的值为 chars。StrCopy (&T, S)初始条件:串 S 存在。操作结果:由串 S 复制得串 T。 DestroyString (&S)初始条件:串 S 存在。操作结果:串 S 被销毁。 StrEmpty (S)初始条件:串 S 存在。操作结果:若 S 为空串,则返回 TRUE,否则返回 FALSE。 StrCompare (S, T)初始条件:串 S 和 T 存在。操作结果:若ST,则返回值=0;若S=T,则返回值0;若ST,则返回值0。StrLength (S)初始条件:串 S 存在。操作结果:返回串 S 序列中的字符个数,即串的长度。Clear
3、String (&S)初始条件:串 S 存在。操作结果:将 S 清为空串。Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 联接而成的新串。 SubString (&Sub, S, pos, len) 初始条件:串S存在,1posStrLength(S)且0lenStrLength(S)-pos+1。 操作结果:用 Sub 返回串S的第 pos 个字符起长度为 len 的子串。 Index (S, T, pos) 初始条件:串S和T存在,T 是非空串,1posStrLength(S)。 操作结果:若主串S中存在和串T值相同的
4、子串,则返回它在主串S中第pos个字 符之后第一次出现的位置;否则函数值为0。Replace (&S, T, V) 初始条件:串 S,T 和 V 存在,T 是非空串。 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。 StrInsert (&S, pos, T) 初始条件:串 S 和 T 存在,1posStrLength(S)1。 操作结果:在串 S 的第 pos 个字符之前插入串 T。 StrDelete (&S, pos, len) 初始条件:串 S 存在,1posStrLength(S)-len+1。 操作结果:从串 S 中删除第 pos 个字符起长度为 len 的子串。实验
5、源代码:#include#include#include#includeusing namespace std;#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0#define OK 1#define MAXSTRLEN 255 /用户可在内定义最大串长typedef unsigned char SStringMAXSTRLEN+1; /0号单元存放串长度typedef int Status; /Status 是函数的类型,其值是函数结果的代码typedef int ElemT
6、ype;/chars 是串常量,赋于串T的值为chars;void StrAssign(SString &T, char chars255) int length,i=0; length=strlen(chars); if(length255) cout字符串长度超出范围,将截取前个字符;endl; for(i=0;iMAXSTRLEN;i+) Ti+1=charsi; T0=255; else for(i=0;ilength;i+) Ti+1=charsi; T0=length; /串S 存在,由串S 复制得串T;void StrCopy(SString &T, SString S) int
7、 i=0; while(i=S0) Ti=Si; i+; /销毁串void DestroyString(SString &S) S0=0; cout串已被销毁;endl;/串S 存在,若S 为空串,则返回TRUE,否则返回FALSE。Status StrEmpty(SString S) if(S0=0) cout该串为空串;endl; return TRUE; else cout该串不为空串;T,则返回值0;/若S=T,则返回值=0;若ST,则返回值T0) return 1; else if(S0T0) return (-1); else for(i=1;i=S0;i+) if(Si=Ti)
8、k=1; else break; if(k=1) return 0; else return 2; /串S 存在,返回串S 序列中的字符个数,即串的长度。Status StrLength(SString S) return S0;/串S 存在,将S 清为空串。void ClearString(SString &S) int i; for(i=1;i=S0;i+) Si=0; S0=0; cout串已被重置为空串;MAXSTRLEN) cout两串联接后超出长度范围,将进行截断;endl; for(i=1;i=S10;i+) Ti=S1i; if(iMAXSTRLEN) while(iMAXST
9、RLEN) i+;j+; Ti=S2j; T0=MAXSTRLEN; else for(i=1;i=S10;i+) Ti=S1i; for(j=1;j=1&pos=0&len=StrLength(S)-pos+1) Sub0=len; for(i=pos;i=pos+len-1;i+) Subj=Si; j+; else cout输入len的值不合法;endl; else cout输入pos的值不合法;0) n=StrLength(S); m=StrLength(T); i=pos; while(i=n-m+1) SubString(Sub,S,i,m); if(StrCompare(Sub,
10、T)!=0) i+; else return i; return 0;/串S,T 和V 存在,T 是非空串/用V替换主串S中出现的所有与T相等的不重叠的子串void Replace(SString &S,SString T,SString V) int n,i,j=1; while(n=Index(S,T,1)!=0) j=1; for(i=n;iMAXSTRLEN) cout插入后会超出串长度范围,将进行截取;MAXSTRLEN-m;i-) Si=Sj; j+; j=1; for(i=pos;i=n+pos;i-) Si=Sj; j-; j=1; for(i=pos;in+pos;i+) S
11、i=Tj; j+; S0=u+n; void StrDelete(SString &S,int pos,int len)/串S 存在,posStrLength(S)-len+1/从串S 中删除第pos 个字符起长度为len 的子串 int n,i,j; n=StrLength(S); if(posStrLength(S)-len+1) cout输入的pos值不合法;endl; else j=pos+len; for(i=pos;i=n;i+) Si=Sj; j+; S0=n-len; Sn-len+1=0; void shuru(SString &T) char chars256; cout请
12、输入你要的字符数据:endl; gets(chars); StrAssign(T,chars);void shuchu(SString T) for(int i=0;iT0;i+) coutTi+1; coutendl;int main() int n,pos,len; SString T2,T1,S,S1,S2,Sub,V; shuru(S1); coutendl; cout串S1为:endl; shuchu(S1); coutendl; shuru(T1); coutpos; n=Index(S1,T1,pos); if(n=0) cout主串中不存在这样的子串;endl; else co
13、ut第一个这样的子串在主串中第pos个字符后出现的位置为:nendl; coutendl; getchar(); shuru(T2); shuru(V); Replace(S1,T2,V); cout取代后的串S为:endl; shuchu(S1); coutendl; shuru(S2); Concat (S,S1,S2); cout联接后的新串S为:endl; shuchu(S); coutendl; cout串S的长度为:StrLength(S)endl; coutendl; DestroyString(S1); DestroyString(S2); coutendl; return 0;【测试数据及实验结果】 测试数据及实验结果如下:【实验小结】定长顺序串的存储结构与c语言中用字符指针存储字符串相比有何优点?答:优点是定长顺序串的存储结构类似于数组,调用起来比较方便快捷.【源代码说明】1 文件名:shiyan3.cpp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1