实验三 串基本操作的实现.docx
《实验三 串基本操作的实现.docx》由会员分享,可在线阅读,更多相关《实验三 串基本操作的实现.docx(14页珍藏版)》请在冰豆网上搜索。
实验三串基本操作的实现
实验三串基本操作的实现
【实验课程名称】数据结构
【实验项目名称】串基本操作的实现
【实验目的】
1理解定长顺序串的存储结构及基本操作的定义
2掌握定长顺序串的基本操作;
3学会设计实验数据验证程序。
【实验仪器及环境】计算机,windowxp操作系统,VC++6.0
【实验内容及步骤】
1.存储结构定义:
#defineMAXSTRLEN255//串的长度最大为255
typedefunsignedcharSString[MAXSTRLEN+1];
//0号单元存放串的长度,其最大值刚好是255
2.实现的基本操作:
StrAssign(&T,chars)
初始条件:
chars是串常量。
操作结果:
赋于串T的值为chars。
StrCopy(&T,S)
初始条件:
串S存在。
操作结果:
由串S复制得串T。
DestroyString(&S)
初始条件:
串S存在。
操作结果:
串S被销毁。
StrEmpty(S)
初始条件:
串S存在。
操作结果:
若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S,T)
初始条件:
串S和T存在。
操作结果:
若S>T,则返回值=0;若S=T,则返回值<0;若S StrLength(S)
初始条件:
串S存在。
操作结果:
返回串S序列中的字符个数,即串的长度。
ClearString(&S)
初始条件:
串S存在。
操作结果:
将S清为空串。
Concat(&T,S1,S2)
初始条件:
串S1和S2存在。
操作结果:
用T返回由S1和S2联接而成的新串。
SubString(&Sub,S,pos,len)
初始条件:
串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。
操作结果:
用Sub返回串S的第pos个字符起长度为len的子串。
Index(S,T,pos)
初始条件:
串S和T存在,T是非空串,1≤pos≤StrLength(S)。
操作结果:
若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字
符之后第一次出现的位置;否则函数值为0。
Replace(&S,T,V)
初始条件:
串S,T和V存在,T是非空串。
操作结果:
用V替换主串S中出现的所有与T相等的不重叠的子串。
StrInsert(&S,pos,T)
初始条件:
串S和T存在,1≤pos≤StrLength(S)+1。
操作结果:
在串S的第pos个字符之前插入串T。
StrDelete(&S,pos,len)
初始条件:
串S存在,1≤pos≤StrLength(S)-len+1。
操作结果:
从串S中删除第pos个字符起长度为len的子串。
实验源代码:
#include
#include
#include
#include
usingnamespacestd;
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
#defineOK1
#defineMAXSTRLEN255//用户可在内定义最大串长
typedefunsignedcharSString[MAXSTRLEN+1];//0号单元存放串长度
typedefintStatus;//Status是函数的类型,其值是函数结果的代码
typedefintElemType;
//chars是串常量,赋于串T的值为chars;
voidStrAssign(SString&T,charchars[255])
{
intlength,i=0;
length=strlen(chars);
if(length>255)
{
cout<<"字符串长度超出范围,将截取前个字符;"<for(i=0;iT[i+1]=chars[i];
T[0]=255;
}
else
{
for(i=0;iT[i+1]=chars[i];
T[0]=length;
}
}
//串S存在,由串S复制得串T;
voidStrCopy(SString&T,SStringS)
{
inti=0;
while(i<=S[0])
{
T[i]=S[i];
i++;
}
}
//销毁串
voidDestroyString(SString&S)
{
S[0]=0;
cout<<"串已被销毁;"<}
//串S存在,若S为空串,则返回TRUE,否则返回FALSE。
StatusStrEmpty(SStringS)
{
if(S[0]==0)
{
cout<<"该串为空串;"<returnTRUE;
}
else
{
cout<<"该串不为空串;"<returnFALSE;
}
}
//串S和T存在,若S>T,则返回值>0;
//若S=T,则返回值=0;若SStatusStrCompare(SStringS,SStringT)
{
inti,k=0;
if(S[0]>T[0])
return1;
elseif(S[0]return(-1);
else
{
for(i=1;i<=S[0];i++)
{
if(S[i]==T[i])
k=1;
else
break;
}
if(k==1)
return0;
else
return2;
}
}
//串S存在,返回串S序列中的字符个数,即串的长度。
StatusStrLength(SStringS)
{
returnS[0];
}
//串S存在,将S清为空串。
voidClearString(SString&S)
{
inti;
for(i=1;i<=S[0];i++)
S[i]='\0';
S[0]=0;
cout<<"串已被重置为空串;"<}
//串S1和S2存在,用T返回由S1和S2联接而成的新串。
voidConcat(SString&T,SStringS1,SStringS2)
{
inti=1,j=0;
if(S1[0]+S2[0]>MAXSTRLEN)
{
cout<<"两串联接后超出长度范围,将进行截断;"<for(i=1;i<=S1[0];i++)
{
T[i]=S1[i];
}
if(i{
while(i{
i++;j++;
T[i]=S2[j];
}
}
T[0]=MAXSTRLEN;
}
else
{
for(i=1;i<=S1[0];i++)
{
T[i]=S1[i];
}
for(j=1;j<=S2[0];j++)
{
T[i]=S2[j];
i++;
}
T[0]=S1[0]+S2[0];
}
}
//串S存在,≤pos≤StrLength(S)且≤len≤StrLength(S)-pos+1
//用Sub返回串S的第pos个字符起长度为len的子串
voidSubString(SString&Sub,SStringS,intpos,intlen)
{
inti,j=1;
if(pos>=1&&pos<=StrLength(S))
if(len>=0&&len<=StrLength(S)-pos+1)
{
Sub[0]=len;
for(i=pos;i<=pos+len-1;i++)
{
Sub[j]=S[i];
j++;
}
}
else
cout<<"输入len的值不合法;"<else
cout<<"输入pos的值不合法;"<}
//串S和T存在,T是非空串,≤pos≤StrLength(S)
//若主串S中存在和串T值相同的子串,则返回它在
//主串S中第pos个字符之后第一次出现的位置;否则函数值为。
StatusIndex(SStringS,SStringT,intpos)
{
intn,m,i;
SStringSub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<=n-m+1)
{
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!
=0)
i++;
else
returni;
}
}
return0;
}
//串S,T和V存在,T是非空串
//用V替换主串S中出现的所有与T相等的不重叠的子串
voidReplace(SString&S,SStringT,SStringV)
{
intn,i,j=1;
while((n=Index(S,T,1))!
=0)
{
j=1;
for(i=n;i<=n+StrLength(T)-1;i++)
{
S[i]=V[j];
j++;
}
}
}
//串S和T存在,≤pos≤StrLength(S)+
//在串S的第pos个字符之前插入串T
voidStrInsert(SString&S,intpos,SStringT)
{
intn,m,i,j,u;
n=StrLength(T);
u=StrLength(S);
if((S[0]+T[0])>MAXSTRLEN)
{
cout<<"插入后会超出串长度范围,将进行截取;"<m=MAXSTRLEN-(n+pos-1);
j=pos;
for(i=MAXSTRLEN;i>MAXSTRLEN-m;i--)
{
S[i]=S[j];
j++;
}
j=1;
for(i=pos;i<=n;i++)
{
S[i]=T[j];
j++;
}
S[0]=MAXSTRLEN;
}
else
{
j=u;
for(i=u+n;i>=n+pos;i--)
{
S[i]=S[j];
j--;
}
j=1;
for(i=pos;i{
S[i]=T[j];
j++;
}
S[0]=u+n;;
}
}
voidStrDelete(SString&S,intpos,intlen){
//串S存在,≤pos≤StrLength(S)-len+1
//从串S中删除第pos个字符起长度为len的子串
intn,i,j;
n=StrLength(S);
if(pos<1||pos>StrLength(S)-len+1)
cout<<"输入的pos值不合法;"<else
{
j=pos+len;
for(i=pos;i<=n;i++)
{
S[i]=S[j];
j++;
}
S[0]=n-len;
S[n-len+1]='\0';
}
}
voidshuru(SString&T){
charchars[256];
cout<<"请输入你要的字符数据:
"<gets(chars);
StrAssign(T,chars);
}
voidshuchu(SStringT)
{
for(inti=0;i{
cout<}
cout<}
intmain()
{
intn,pos,len;
SStringT2,T1,S,S1,S2,Sub,V;
shuru(S1);
cout<cout<<"串S1为:
"<shuchu(S1);
cout<shuru(T1);
cout<<"请输入pos的大小:
";
cin>>pos;
n=Index(S1,T1,pos);
if(n==0)
cout<<"主串中不存在这样的子串;"<else
cout<<"第一个这样的子串在主串中第"<"<cout<getchar();
shuru(T2);
shuru(V);
Replace(S1,T2,V);
cout<<"取代后的串S为:
"<shuchu(S1);
cout<shuru(S2);
Concat(S,S1,S2);
cout<<"联接后的新串S为:
"<shuchu(S);
cout<cout<<"串S的长度为:
"<cout<DestroyString(S1);
DestroyString(S2);
cout<return0;
}
【测试数据及实验结果】
测试数据及实验结果如下:
【实验小结】
定长顺序串的存储结构与c语言中用字符指针存储字符串相比有何优点?
答:
优点是定长顺序串的存储结构类似于数组,调用起来比较方便快捷.
【源代码说明】
1.文件名:
shiyan3.cpp