数据结构串实践报告.docx

上传人:b****4 文档编号:4028552 上传时间:2022-11-27 格式:DOCX 页数:20 大小:102.10KB
下载 相关 举报
数据结构串实践报告.docx_第1页
第1页 / 共20页
数据结构串实践报告.docx_第2页
第2页 / 共20页
数据结构串实践报告.docx_第3页
第3页 / 共20页
数据结构串实践报告.docx_第4页
第4页 / 共20页
数据结构串实践报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构串实践报告.docx

《数据结构串实践报告.docx》由会员分享,可在线阅读,更多相关《数据结构串实践报告.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构串实践报告.docx

数据结构串实践报告

成绩:

实验报告

课程名称:

数据结构实践课

实验项目:

定长串存储方法

姓名:

专业:

班级:

学号:

计算机科学与技术学院

实验教学中心

2017年9月23日

实验项目名称:

串的定长存储表示方法

一、实践目的:

1.熟练掌握串的定长顺序存储表示方法。

2.利用串的基本操作实现相关算法。

二、实践内容:

1.实现串的定长顺序存储表示的基本操作。

并用主程序进行多次验证。

2.设s='abcdefghijk'、t='cde'为两个字符串,利用定长顺序存储结构的串操作,判断t是否为s的子串。

如果是,输出子串所在位置(第一个字符)。

编程实现。

3.已知三个字符串分别为s=’ababababcaabcbcaaaaaa’,s1=’caab’, s2=’bcb’。

利用所学字符串基本运算的函数得到结果串为:

s3=’caabcbcaaaaaacaaaaaa’。

编程实现。

三、实验用设备仪器及材料

计算机

四、实验原理及接线

五、实验操作步骤

//main4-1.cpp检验bo4-1.cpp的主程序

//c1.h(程序名)

#include

#include

#include//malloc()等

#include//INT_MAX等

#include//EOF(=^Z或F6),NULL

#include//atoi()

#include//eof()

#include//floor(),ceil(),abs()

#include//exit()

//#include//cout,cin

//函数结果状态代码

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行

typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等

typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE

//c4-1.h串的定长顺序存储表示

#defineMAXSTRLEN30//用户可在255以内定义最大串长(1个字节)

typedefcharSString[MAXSTRLEN+1];//0号单元存放串的长度

//bo4-1.cpp串采用定长顺序存储结构(由c4-1.h定义)的基本操作(14个)

//SString是数组,故不需引用类型。

此基本操作包括算法4.2,4.3,4.5

StatusStrAssign(SString&T,char*chars)

{

///生成一个其值等于chars的串T

inti;

if(strlen(chars)>MAXSTRLEN)

returnERROR;

else

{

T[0]=strlen(chars);

for(i=1;i<=T[0];i++)

T[i]=*(chars+i-1);

returnOK;

}

}

StatusStrCopy(SStringT,SStringS)

{

///由串S复制得串T

inti;

for(i=0;i<=S[0];i++)

T[i]=S[i];

returnOK;

}

StatusStrEmpty(SStringS)

{

///若S为空串,则返回TRUE,否则返回FALSE

if(S[0]==0)

returnTRUE;

else

returnFALSE;

}

intStrCompare(SStringS,SStringT)

{

///初始条件:

串S和T存在

///操作结果:

若S>T,则返回值>0;若S=T,则返回值=0;若S

inti;

for(i=1;i<=S[0]&&i<=T[0];++i)

if(S[i]!

=T[i])

returnS[i]-T[i];

returnS[0]-T[0];

}

intStrLength(SStringS)

{

///返回串的元素个数

returnS[0];

}

StatusClearString(SStringS)

{

///初始条件:

串S存在。

操作结果:

将S清为空串

S[0]=0;//令串长为零

returnOK;

}

StatusConcat(SString&T,SStringS1,SStringS2)//算法4.2改

{

//用T返回S1和S2联接而成的新串。

若未截断,则返回TRUE,否则FALSE

inti;

if(S1[0]+S2[0]<=MAXSTRLEN)

{

//未截断

for(i=1;i<=S1[0];i++)

T[i]=S1[i];

for(i=1;i<=S2[0];i++)

T[S1[0]+i]=S2[i];

T[0]=S1[0]+S2[0];

returnTRUE;

}

else

{

//截断S2

for(i=1;i<=S1[0];i++)

T[i]=S1[i];

for(i=1;i<=MAXSTRLEN-S1[0];i++)

T[S1[0]+i]=S2[i];

T[0]=MAXSTRLEN;

returnFALSE;

}

}

StatusSubString(SString&Sub,SStringS,intpos,intlen)

{

///用Sub返回串S的第pos个字符起长度为len的子串。

算法4.3

inti;

if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)

returnERROR;

for(i=1;i<=len;i++)

Sub[i]=S[pos+i-1];

Sub[0]=len;

returnOK;

}

intIndex(SStringS,SStringT,intpos)

{

///返回子串T在主串S中第pos个字符之后的位置。

若不存在,则函数值为0。

///其中,T非空,1≤pos≤StrLength(S)。

算法4.5

inti,j;

if(1<=pos&&pos<=S[0])

{

i=pos;

j=1;

while(i<=S[0]&&j<=T[0])

if(S[i]==T[j])//继续比较后继字符

{

++i;

++j;

}

else//指针后退重新开始匹配

{

i=i-j+2;

j=1;

}

if(j>T[0])

returni-T[0];

else

return0;

}

else

return0;

}

StatusStrInsert(SStringS,intpos,SStringT)

{

//初始条件:

串S和T存在,1≤pos≤StrLength(S)+1

//操作结果:

在串S的第pos个字符之前插入串T。

完全插入返回TRUE,部分插入返回FALSE

inti;

if(pos<1||pos>S[0]+1)

returnERROR;

if(S[0]+T[0]<=MAXSTRLEN)

{

///完全插入

for(i=S[0];i>=pos;i--)

S[i+T[0]]=S[i];

for(i=pos;i

S[i]=T[i-pos+1];

S[0]=S[0]+T[0];

returnTRUE;

}

else

{

///部分插入

for(i=MAXSTRLEN;i<=pos;i--)

S[i]=S[i-T[0]];

for(i=pos;i

S[i]=T[i-pos+1];

S[0]=MAXSTRLEN;

returnFALSE;

}

}

StatusStrDelete(SStringS,intpos,intlen)

{

//初始条件:

串S存在,1≤pos≤StrLength(S)-len+1

//操作结果:

从串S中删除第pos个字符起长度为len的子串

inti;

if(pos<1||pos>S[0]-len+1||len<0)

returnERROR;

for(i=pos+len;i<=S[0];i++)

S[i-len]=S[i];

S[0]-=len;

returnOK;

}

StatusReplace(SStringS,SStringT,SStringV)

{

//初始条件:

串S,T和V存在,T是非空串(此函数与串的存储结构无关)

//操作结果:

用V替换主串S中出现的所有与T相等的不重叠的子串

inti=1;//从串S的第一个字符起查找串T

if(StrEmpty(T))//T是空串

returnERROR;

do

{

i=Index(S,T,i);//结果i为从上一个i之后找到的子串T的位置

if(i)//串S中存在串T

{

StrDelete(S,i,StrLength(T));//删除该串T

StrInsert(S,i,V);//在原串T的位置插入串V

i+=StrLength(V);//在插入的串V后面继续查找串T

}

}

while(i);

returnOK;

}

voidDestroyString()

{

//由于SString是定长类型,无法销毁

}

voidStrPrint(SStringT)

{

//输出字符串T。

另加

inti;

for(i=1;i<=T[0];i++)

printf("%c",T[i]);

printf("\n");

//printf("\n");

}

intmain()

{

charg='1';

inti,j;

Statusk;

chars,c[MAXSTRLEN+1];

SStringt,s1,s2;

printf("请输入串s1:

");

gets(c);

k=StrAssign(s1,c);

if(!

k)

{

printf("串长超过MAXSTRLEN(=%d)\n",MAXSTRLEN);

exit(0);

}

printf("串长为%d串空否?

%d(1:

是0:

否)\n",StrLength(s1),StrEmpty(s1));

StrCopy(s2,s1);

printf("拷贝s1生成的串为:

");

StrPrint(s2);

printf("请输入串s2:

");

gets(c);

k=StrAssign(s2,c);

if(!

k)

{

printf("串长超过MAXSTRLEN(%d)\n",MAXSTRLEN);

exit(0);

}

i=StrCompare(s1,s2);

if(i<0)

s='<';

elseif(i==0)

s='=';

else

s='>';

printf("串s1%c串s2\n",s);

k=Concat(t,s1,s2);

printf("串s1联接串s2得到的串t为:

");

StrPrint(t);

if(k==FALSE)

printf("串t有截断\n");

ClearString(s1);

printf("清为空串后,串s1为:

");

StrPrint(s1);

printf("串长为%d串空否?

%d(1:

是0:

否)\n",StrLength(s1),StrEmpty(s1));

printf("求串t的子串,请输入子串的起始位置,子串长度:

");

scanf("%d,%d",&i,&j);

k=SubString(s2,t,i,j);

if(k)

{

printf("子串s2为:

");

StrPrint(s2);

}

printf("从串t的第pos个字符起,删除len个字符,请输入pos,len:

");

scanf("%d,%d",&i,&j);

StrDelete(t,i,j);

printf("删除后的串t为:

");

StrPrint(t);

i=StrLength(s2)/2;

StrInsert(s2,i,t);

printf("在串s2的第%d个字符之前插入串t后,串s2为:

\n",i);

StrPrint(s2);

i=Index(s2,t,1);

printf("s2的第%d个字母起和t第一次匹配\n",i);

SubString(t,s2,1,1);

printf("串t为:

");

StrPrint(t);

Concat(s1,t,t);

printf("串s1为:

");

StrPrint(s1);

Replace(s2,t,s1);

printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为:

");

StrPrint(s2);

while(g!

='0')scanf("%c",&g);

}

//main4-1.cpp检验bo4-1.cpp的主程序

//c1.h(程序名)

#include

#include

#include//malloc()等

#include//INT_MAX等

#include//EOF(=^Z或F6),NULL

#include//atoi()

#include//eof()

#include//floor(),ceil(),abs()

#include//exit()

//#include//cout,cin

//函数结果状态代码

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行

typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等

typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE

//c4-1.h串的定长顺序存储表示

#defineMAXSTRLEN30//用户可在255以内定义最大串长(1个字节)

typedefcharSString[MAXSTRLEN+1];//0号单元存放串的长度

//bo4-1.cpp串采用定长顺序存储结构(由c4-1.h定义)的基本操作(14个)

//SString是数组,故不需引用类型。

此基本操作包括算法4.2,4.3,4.5

StatusStrAssign(SString&T,char*chars)

{

///生成一个其值等于chars的串T

inti;

if(strlen(chars)>MAXSTRLEN)

returnERROR;

else

{

T[0]=strlen(chars);

for(i=1;i<=T[0];i++)

T[i]=*(chars+i-1);

returnOK;

}

}

StatusStrCopy(SStringT,SStringS)

{

///由串S复制得串T

inti;

for(i=0;i<=S[0];i++)

T[i]=S[i];

returnOK;

}

StatusStrEmpty(SStringS)

{

///若S为空串,则返回TRUE,否则返回FALSE

if(S[0]==0)

returnTRUE;

else

returnFALSE;

}

intStrCompare(SStringS,SStringT)

{

///初始条件:

串S和T存在

///操作结果:

若S>T,则返回值>0;若S=T,则返回值=0;若S

inti;

for(i=1;i<=S[0]&&i<=T[0];++i)

if(S[i]!

=T[i])

returnS[i]-T[i];

returnS[0]-T[0];

}

intStrLength(SStringS)

{

///返回串的元素个数

returnS[0];

}

StatusClearString(SStringS)

{

///初始条件:

串S存在。

操作结果:

将S清为空串

S[0]=0;//令串长为零

returnOK;

}

StatusConcat(SString&T,SStringS1,SStringS2)//算法4.2改

{

//用T返回S1和S2联接而成的新串。

若未截断,则返回TRUE,否则FALSE

inti;

if(S1[0]+S2[0]<=MAXSTRLEN)

{

//未截断

for(i=1;i<=S1[0];i++)

T[i]=S1[i];

for(i=1;i<=S2[0];i++)

T[S1[0]+i]=S2[i];

T[0]=S1[0]+S2[0];

returnTRUE;

}

else

{

//截断S2

for(i=1;i<=S1[0];i++)

T[i]=S1[i];

for(i=1;i<=MAXSTRLEN-S1[0];i++)

T[S1[0]+i]=S2[i];

T[0]=MAXSTRLEN;

returnFALSE;

}

}

StatusSubString(SString&Sub,SStringS,intpos,intlen)

{

///用Sub返回串S的第pos个字符起长度为len的子串。

算法4.3

inti;

if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)

returnERROR;

for(i=1;i<=len;i++)

Sub[i]=S[pos+i-1];

Sub[0]=len;

returnOK;

}

intIndex(SStringS,SStringT,intpos)

{

///返回子串T在主串S中第pos个字符之后的位置。

若不存在,则函数值为0。

///其中,T非空,1≤pos≤StrLength(S)。

算法4.5

inti,j;

if(1<=pos&&pos<=S[0])

{

i=pos;

j=1;

while(i<=S[0]&&j<=T[0])

if(S[i]==T[j])//继续比较后继字符

{

++i;

++j;

}

else//指针后退重新开始匹配

{

i=i-j+2;

j=1;

}

if(j>T[0])

returni-T[0];

else

return0;

}

else

return0;

}

StatusStrInsert(SStringS,intpos,SStringT)

{

//初始条件:

串S和T存在,1≤pos≤StrLength(S)+1

//操作结果:

在串S的第pos个字符之前插入串T。

完全插入返回TRUE,部分插入返回FALSE

inti;

if(pos<1||pos>S[0]+1)

returnERROR;

if(S[0]+T[0]<=MAXSTRLEN)

{

///完全插入

for(i=S[0];i>=pos;i--)

S[i+T[0]]=S[i];

for(i=pos;i

S[i]=T[i-pos+1];

S[0]=S[0]+T[0];

returnTRUE;

}

else

{

///部分插入

for(i=MAXSTRLEN;i<=pos;i--)

S[i]=S[i-T[0]];

for(i=pos;i

S[i]=T[i-pos+1];

S[0]=MAXSTRLEN;

returnFALSE;

}

}

StatusStrDelete(SStringS,intpos,intlen)

{

//初始条件:

串S存在,1≤pos≤StrLength(S)-len+1

//操作结果:

从串S中删除第pos个字符起长度为len的子串

inti;

if(pos<1||pos>S[0]-len+1||len<0)

returnERROR;

for(i=pos+len;i<=S[0];i++)

S[i-len]=S[i];

S[0]-=len;

returnOK;

}

StatusReplace(SStringS,SStringT,SStringV)

{

//初始条件:

串S,T和V存在,T是非空串(此函数与串的存储结构无关)

//操作结果:

用V替换主串S中出现的所有与T相等的不重叠的子串

inti=1;//从串S的第一个字符起查找串T

if(StrEmpty(T))//T是空串

returnERROR;

do

{

i=Index(S,T,i);//结果i为从上一个i之后找到的子串T的位置

if(i)//串S中存在串T

{

StrDelete(S,i,StrLength(T));//删除该串T

StrInsert(S,i,V);//在原串T的位置插入串V

i+=StrLength(V);//在插入的串V后面继续查找串T

}

}

while(i);

returnOK;

}

voidDestroyString()

{

//由于SString是

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

当前位置:首页 > PPT模板 > 动态背景

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

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