StatusStrCompare(HStringS,HStringT)
//6.串替换:
在主串s中用子串v替换所有的子串t
StatusStrReplace(HString&S,HStringV,HStringT)
//7.串插入:
在主串s中的给定位置pos插入子串t
StatusStrInsert(HString&S,intpos,HStringT)
//8.取子串:
将串s中从起始位置pos开始长度len的字符串放入另一个串t
StatusSubString(HString&S,intpos,intlen,HString&T)
//9.串删除:
删除串s中的子串t。
StatusStrDelete(HString&S,HStringT)
//10.求子串位置:
从主串s中取出从第i个位置开始、长度和串t相同的子串,和t进行比较,若相等,则t在s中的位置值为i
StatusStrIndex(HString&S,inti,HStringT)
//
(2)串应用:
设有串s,求出它的所有子串,并输出。
StatusSubString_All(HStringS)
3.实验要求
(1)上机前交实验源程序(纸质版),由学习委员统一收好交老师(附上不交同学名单)。
(2)用一切你能想到的办法解决遇到的问题,培养解决问题的能力。
(3)实验课上进行答辩。
(4)实验报告当场交。
报告内容包括:
实验目的、实验内容、实验代码、实验运行结果以及实验体会供五部分。
串的堆分配存储
typedefstruct
{
char*ch;//若是非空串,则按串长分配储存区,否则ch为NULL
intlength;//串长度
}HString;
3.主要算法
3.1顺序存储结构
(1)结构定义:
#include
#include
#include
#defineMAX255
typedefcharsstring[MAX+1];
intstrlength(sstrings);//判断串长
intstrempty(sstrings);//判断空串
intstrassign(sstring&t,char*s);//串赋值
intconcat(sstring&t,sstrings1,sstrings2);//串连接
intstrcompare(sstrings,sstringt);//串的比较
voidstrprint(sstrings);//输出
intstrinsert(sstrings,intpos,sstringt);//串插入
intstrdelete(sstrings,intpos,intlen);//删除字串
intreplace(sstrings,sstringt,sstringv);//串的替换
intsubstring(sstring&sub,sstrings,intpos,intlen);//取子串
intindex(sstrings,sstringt,intpos);//字串定位
//串赋值
intstrassign(sstring&t,char*s)
{//初始条件:
字符串chars已经存在
//操作结果:
生成一个其值等于chars的串t
inti,n;
n=strlen(s);
if(n>=MAX)
return0;
else
{
t[0]=n;
for(i=1;i<=t[0];i++)//依次给串赋值
t[i]=s[i-1];
return1;
}
}
//求串长度
intstrlength(sstrings)
{//操作结果:
返回串s的元素
returns[0];
}
//判断串是否空
intstrempty(sstrings)
{
return(s[0]==0);//返回值
}
//串连接
intconcat(sstring&t,sstrings1,sstrings2)
{//初始条件:
字符串s1和s2已经存在
//操作结果:
用T返回s1和s2连接成的新串。
inti;
if(s1[0]+s2[0]<=MAX)
{
for(i=1;i<=s1[0];i++)//依次把串s1中的元素赋值给串t
t[i]=s1[i];
for(i=1;i<=s2[0];i++)
t[i+s1[0]]=s2[i];
t[0]=s1[0]+s2[0];//计算串t的长度
return1;
}
else
{
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=1;i<=MAX-s1[0];i++)
t[i+s1[0]]=s2[i];
t[0]=MAX;
return1;
}
}
//串的比较
intstrcompare(sstrings,sstringt)
{//初始条件:
字符串chars已经存在
//操作结果:
若是s>t,则返回值>0,若是s=t,则返回值=0,若是sinti;
for(i=1;i<=t[i]&&i<=s[0];i++)
if(s[i]!
=t[i])
returns[i]-t[i];//返回大于的值
returns[0]-t[0];//返回大于的值
}
//输出
voidstrprint(sstrings)
{//初始条件:
字符串chars已经存在
//操作结果:
依次输出串中的元素
inti;
for(i=1;i<=s[0];i++)
printf("%c",s[i]);
printf("\n\n");
}
//串插入
intstrinsert(sstrings,intpos,sstringt)
{//初始条件:
字符串chars已经存在
//操作结果:
在串s第pos个字符之前插入串t,完成插入返回,否则返回
inti;
if(pos<1||pos>s[0]+1)
return0;
if(s[0]+t[0]<=MAX)
{
for(i=s[0];i>=pos;i--)
s[i+t[0]]=s[i];
for(i=pos;is[i]=t[i-pos+1];
s[0]+=t[0];
return1;
}
else
{
for(i=s[0];i>=pos;i--)
s[i+MAX-s[0]]=s[i];
for(i=pos;i<=s[0];i++)
s[i]=t[i-pos+1];
s[0]=MAX;
return1;
}
}
//删除字串
intstrdelete(sstrings,intpos,intlen)
{//初始条件:
字符串chars已经存在
//操作结果:
在串s第pos个字符起删除长度为len的子串,删除成功返回,否则返回
inti;
if(pos<1||pos>s[0]-len+1||len<0)
return0;
for(i=pos+len;i<=s[0];i++)//依次删除串中指定的元素
s[i-len]=s[i];
s[0]-=len;
return1;
}
//串的替换
intreplace(sstrings,sstringt,sstringv)
{//初始条件:
字符串chars已经存在
//操作结果:
串t被s替换,成功返回,否则返回
inti=1;
intk;
if(strempty(t))//判断串t为空
return0;
do
{
i=index(s,t,i);
printf("%d",i);
if(i)
{
strdelete(s,i,t[0]);//调用函数
k=strinsert(s,i,v);//调用函数
if(!
k)
return0;
i+=v[0];
}
}while(i);
return1;
}
//取子串
intsubstring(sstring&sub,sstrings,intpos,intlen)
{//初始条件:
字符串chars已经存在
//操作结果:
用sub返回串s的第pos个字符起长度为len的子串
inti;
if(pos<1||pos>s[0]||len<0||len>s[0]-pos+1)
return0;
for(i=1;i<=len;i++)
sub[i]=s[pos+i-1];
sub[0]=len;
return1;
}
//字串定位
intindex(sstrings,sstringt,intpos)
{//初始条件:
字符串chars已经存在
//操作结果:
返回子串T在主串S中第pos个字符之后的位置,
//若不存在,则函数值为
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;
}
//主函数
voidmain()
{
inti,pos,len;
chara[MAX],b[MAX],c[MAX];
sstrings,t,v,sews,sub;
intk;//设置选项变量
while
(1)
{
//system("cls");//清屏
printf("\n\t***************************************************");
printf("\n\t*串的基本操作及其应用*");
printf("\n\t***************************************************\n");
printf("\t*1.串的赋值2.串比较*\n");
printf("\t*3.串的长度4.取子串*\n");
printf("\t*5.字符串替换6.字符串插入*\n");
printf("\t*7.字符串连接8.销毁队列*\n");
printf("\t*9.清空队列0.退出*\n");
printf("\t****************************************************\n");
printf("请选择选项<1-9>:
");//打印选项功能提示
scanf("%d",&k);
if(k<0||k>9)
{
printf("输入有误,请重新输入!
");
printf("\n");
continue;
}
switch(k)//分支结构来调用各功能子函数
{
case1:
printf("字符串的赋值!
\n");
printf("请输入两个字符串!
\n");
printf("请输入第一个字符串;");
scanf("%s",a);
strassign(s,a);
printf("\n");
printf("请输第二个字符串;");
scanf("%s",b);
strassign(t,b);
printf("第一个字符串为:
");
strprint(s);
printf("第二个字符串为:
");
strprint(t);
printf("\n");
break;//退出并重新进入主菜单
case2:
printf("串的比较!
\n");
i=strcompare(s,t);//调用函数
if(i==0)
printf("两个字符串相等!
\n");
elseif(i<0)
printf("第一个字符串比第二个字符串小!
\n");
else
printf("第一个字符串比第二个字符串大!
\n");
printf("\n");
break;//退出并重新进入主菜单
case3:
printf("求串的长度!
\n");
i=strlength(s);//调用函数
printf("串的长度为:
%d",i);
printf("\n");
break;//退出并重新进入主菜单
case4:
printf("取子串!
\n");
printf("输入一个字符串:
");
scanf("%s",a);
strassign(s,a);//调用函数
printf("\n");
printf("字符串为:
");
strprint(s);
printf("请输入位置和长度!
\n");
scanf("%d%d",&pos,&len);
if(substring(sub,s,pos,len))
{
printf("所取子串为:
");
strprint(sub);
}
else
printf("取子串失败!
");
printf("\n");
break;//退出并重新进入主菜单
case5:
printf("字符串替换!
\n");
printf("请输入主字符串:
");
scanf("%s",a);
strassign(s,a);//调用函数
printf("\n");
printf("请输需要替换子串:
");
scanf("%s",b);
strassign(t,b);//调用函数
printf("请输入需要换成的子串:
");
scanf("%s",c);
strassign(v,c);//调用函数
printf("主字符串为:
");
strprint(s);
printf("需要替换子串为:
");
strprint(t);//调用函数
printf("需要换成的子串为:
");
strprint(v);
if(replace(s,t,v))
{
printf("替换后的新串为:
");
strprint(s);
}
else
printf("替换失败\n");
printf("\n");
break;//退出并重新进入主菜单
case6:
printf("字符串插入\n");
printf("请输入主字符串\n");
scanf("%s",a);
strassign(s,a);//调用函数
printf("请输入要插入的字符串\n");
scanf("%s",b);
strassign(t,b);//调用函数
printf("请输入要插入的位置\n");
scanf("%d",&pos);
printf("主字符串为:
");
strprint(s);//调用函数
printf("要插入的字符串为:
");
strprint(t);
if(strinsert(s,pos,t))
printf("插入后的新串为:
");
strprint(s);//调用函数
printf("\n");
break;//退出并重新进入主菜单
case7:
printf("字符串连接\n");
i=concat(sews,s,t);//调用函数
if(i==0)
printf("连接失败\n");
else
{
printf("连接后的新串为:
\n");
strprint(sews);//调用函数
}
printf("\n");
break;//退出并重新进入主菜单;
case0:
break;
}
}
}
3.流程图
1.串比较流程图
2.串连接流程图
4.程序运行结果
(1)实验内容
(1)
运行结果如下:
运行结果如下:
运行结果如下:
运行结果如下:
运行结果如下:
运行结果如下:
运行结果如下:
5.心得体会。
图的基本操作还有许多的不解之处,特别是最短距离