实验三 串基本操作的实现.docx

上传人:b****5 文档编号:6252039 上传时间:2023-01-04 格式:DOCX 页数:14 大小:78.82KB
下载 相关 举报
实验三 串基本操作的实现.docx_第1页
第1页 / 共14页
实验三 串基本操作的实现.docx_第2页
第2页 / 共14页
实验三 串基本操作的实现.docx_第3页
第3页 / 共14页
实验三 串基本操作的实现.docx_第4页
第4页 / 共14页
实验三 串基本操作的实现.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验三 串基本操作的实现.docx

《实验三 串基本操作的实现.docx》由会员分享,可在线阅读,更多相关《实验三 串基本操作的实现.docx(14页珍藏版)》请在冰豆网上搜索。

实验三 串基本操作的实现.docx

实验三串基本操作的实现

实验三串基本操作的实现

【实验课程名称】数据结构

【实验项目名称】串基本操作的实现

【实验目的】

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;i

T[i+1]=chars[i];

T[0]=255;

}

else

{

for(i=0;i

T[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;若S

StatusStrCompare(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1