数据结构串的基本操作及应用实验报告常用版.docx
《数据结构串的基本操作及应用实验报告常用版.docx》由会员分享,可在线阅读,更多相关《数据结构串的基本操作及应用实验报告常用版.docx(83页珍藏版)》请在冰豆网上搜索。
![数据结构串的基本操作及应用实验报告常用版.docx](https://file1.bdocx.com/fileroot1/2023-2/24/f000c423-0520-4a75-a015-9309cbff483d/f000c423-0520-4a75-a015-9309cbff483d1.gif)
数据结构串的基本操作及应用实验报告常用版
实验日期2021.5.10教师签字成绩
实验报告
【实验名称】第四章串的基本操作及应用
【实验目的】
1、熟悉将算法转换成程序代码的过程。
2、了解串的逻辑结构特性,熟练掌握串顺序存储结构的C语言描述方法。
3、熟练掌握串的基本操作:
求长度、串的连接、插入、删除等,掌握串的存取特性。
【实验原理】
1.串可以可以有三种存储方式,分别为顺序存储、堆分配存储、链式存储,串的基本操作在这三种存储方式下操作。
2.串的模式匹配KMP算法在每一趟匹配过程中出现字符不等时,不需回溯指针,而是利用已经得到的部分匹配结果的结果将模式向右滑动尽可能远的一段距离,继续进行比较。
【实验内容】
1.串的顺序存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)
#include
#include
#include
#include
#defineSIZE20
structHString
{charch[SIZE];
intlength;};
voidStrInsert(HString&s,intpos,HStringt){
inti,j;
if(pos<1||pos>s.length+1)cout<<"ERROR!
";
if(t.length){
for(i=s.length-1;i>=pos-1;--i)
s.ch[i+t.length]=s.ch[i];
for(j=0;j<=t.length-1;j++)
s.ch[pos-1+j]=t.ch[j];
s.length+=t.length;}
}
voidStrDelete(HString&s,intpos,intlen){
inti;intv=pos-1;
if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!
";
for(i=pos+len-1;i<=s.length-1;i++)
s.ch[v++]=s.ch[i];
s.length-=len;
}
voidStrAssign(HString&t,charchars[])
{
inti;
char*c;
for(i=0,c=chars;*c;++i,++c);
if(!
i)
{
t.length=0;
}
else
{
for(intj=0;j
t.ch[j]=chars[j];
t.length=i;
}
}
intStrLen(HString&s)
{
returns.length;
}
intStrCompare(HString&s,HStringt)
{
for(inti=0;i{
if(s.ch[i]!
=t.ch[i])
return(int)(t.ch[i]-s.ch[i]);
}
returns.length-t.length;
}
voidConcat(HString&t,HStrings1,HStrings2)
{
inti=s1.length+s2.length;
for(i=0;it.ch[i]=s1.ch[i];
t.length=s1.length+s2.length;
for(i=s1.length;it.ch[i]=s2.ch[i-s1.length];
}
intSubString(HString&sub,HStrings,intpos,intlen)
{
if(pos<1||pos>s.length||len<0||len>s.length-pos+1)
{
cout<<"ERROR!
"<return0;
}
if(!
len)
{
sub.length=0;
}
else
{
inti=len;
for(i=0;isub.ch[i]=s.ch[pos+i-1];
sub.length=len;
}
}
voidDisplay(HString&t)
{
for(inti=0;i<=t.length-1;i++)
cout<cout<}
voidmain()
{
inti;
chars[20];
do
{
cout<<"选择您要进行的串的基本操作:
"<cout<<"1.插入"<cin>>i;
switch(i)
{
case1:
{
HStrings,t;intpos;
cout<<"请输入串s:
";
cin>>s.ch;
StrAssign(s,s.ch);
cout<cout<<"请输入要插入的串t:
";
cin>>t.ch;
StrAssign(t,t.ch);
cout<cout<<"请输入你所要插入的位置:
";
cin>>pos;
StrInsert(s,pos,t);
cout<<"插入之后串变为:
";
Display(s);
break;
}
case2:
{
HStrings;intpos,len;
cout<<"请输入串s:
";
cin>>s.ch;
StrAssign(s,s.ch);
cout<<"请输入你所要删除串的首位置为:
";
cin>>pos;
cout<<"请输入你需要删除的串的长度:
";
cin>>len;
StrDelete(s,pos,len);
cout<<"删除之后串变为:
";
Display(s);
break;
}
case3:
{
HStrings1,s2,t;
cout<<"请输入串s1:
";
cin>>s1.ch;
StrAssign(s1,s1.ch);
cout<<"请输入串s2:
";
cin>>s2.ch;
StrAssign(s2,s2.ch);
Concat(t,s1,s2);
cout<<"s1与s2合并后的串为:
";
Display(t);
break;
}
case4:
{
HStringsub,s;
intpos,len;
cout<<"请输入主串s:
";
cin>>s.ch;
StrAssign(s,s.ch);
cout<<"请输入所取原串的起始位置pos:
";
cin>>pos;
cout<<"请输入子串的长度len:
";
cin>>len;
SubString(sub,s,pos,len);
cout<<"取出的子串为:
";
Display(sub);
break;
}
case5:
{
HStrings,t;
intvalue;
cout<<"请输入串s:
";
cin>>s.ch;
StrAssign(s,s.ch);
cout<<"请输入串t:
";
cin>>t.ch;
StrAssign(t,t.ch);
value=StrCompare(s,t);
if(value>0)cout<<"串s大于串t"<elseif(value==0)cout<<"串s等于串t"<elsecout<<"串s小于串t"<cout<break;
}
case6:
HStrings;char*chars;intval;
cout<<"请输入串s:
";
cin>>s.ch;
StrAssign(s,s.ch);
val=StrLen(s);
cout<<"串的长度为:
"<case7:
cout<<"操作结束!
"<default:
cout<<"输入错误!
请重新输入!
"<}
}while(i!
=7);
}
2.串的堆分配存储表示及基本操作(插入、删除、求串长、合并连接串、求子串、串比较等)
#include
#include
#include
#include
structHString
{
char*ch;
intlength;
};
voidStrInsert(HString&s,intpos,HStringt){
inti,j;
if(pos<1||pos>s.length+1)cout<<"ERROR!
";
if(t.length){
s.ch=(char*)realloc(s.ch,(s.length+t.length)*sizeof(char));
for(i=s.length-1;i>=pos-1;--i)
s.ch[i+t.length]=s.ch[i];
for(j=0;j<=t.length-1;j++)
s.ch[pos-1+j]=t.ch[j];
s.length+=t.length;}
}
voidStrDelete(HString&s,intpos,intlen){
inti;intv=pos-1;
if(pos<1||pos>s.length||len<0||len>s.length-pos+1)cout<<"ERROR!
";
for(i=pos+len-1;i<=s.length-1;i++)
s.ch[v++]=s.ch[i];
s.length-=len;
}
voidStrAssign(HString&t,char*chars)
{
inti;
char*c;
for(i=0,c=chars;*c;++i,++c);
if(!
i)
{
t.ch=NULL;
t.length=0;
}
else
{
t.ch=(char*)malloc(i*sizeof(char));
for(intj=0;j
t.ch[j]=chars[j];
t.length=i;
}
}
intStrLen(HString&s)
{
returns.length;
}
intStrCompare(HString&s,HStringt)
{
for(inti=0;i{
if(s.ch[i]!
=t.ch[i])
return(int)(t.ch[i]-s.ch[i]);
}
returns.length-t.length;
}
voidConcat(HString&t,HStrings1,HStrings2)
{
inti=s1.length+s2.length;
t.ch=(char*)malloc(i*sizeof(char));
for(i=0;it.ch[i]=s1.ch[i];
t.length=s1.length+s2.length;
for(i=s1.length;it.ch[i]=s2.ch[i-s1.length];
}
intSubString(HString&sub,HStrings,intpos,intlen)
{
if(pos<1||pos>s.length||len<0||len>s.length-pos+1)
{
cout<<"ERROR!
"<return0;
}
if(!
len)
{
sub.ch=NULL;
sub.length=0;
}
else
{
inti=len;
sub.ch=(char*)malloc(i*sizeof(char));
for(i=0;isub.ch[i]=s.ch[pos+i-1];
sub.length=len;
}
}
voidDisplay(HString&t)
{
for(inti=0;i<=t.length-1;i++)
cout<cout<}
voidmain()
{
inti;
chars[20];
cout<<"选择您要进行的串的基本操作:
"<do
{
cout<<"1.插入"<cin>>i;
switch(i)
{
case1:
{
HStrings,t;chara[20],b[20];char*sa,*sb;intpos;
cout<<"请输入串s:
";
cin>>a;
sa=a;
StrAssign(s,sa);
cout<cout<<"请输入要插入的串t:
";
cin>>b;
sb=b;
StrAssign(t,sb);
cout<cout<<"请输入你所要插入的位置:
";
cin>>pos;
StrInsert(s,pos,t);
cout<<"插入之后串变为:
";
Display(s);
break;
}
case2:
{
HStrings;charstr[20];char*chars;intpos,len;
cout<<"请输入串s:
";
cin>>str;
chars=str;
StrAssign(s,chars);
cout<<"请输入你所要删除串的首位置为:
";
cin>>pos;
cout<cout<<"请输入你需要删除的串的长度:
";
cin>>len;
cout<StrDelete(s,pos,len);
cout<<"删除之后串变为:
";
Display(s);
break;
}
case3:
{
HStrings1,s2,t;
chara[20],b[20];
char*sa,*sb;
cout<<"请输入串s1:
";
cin>>a;
sa=a;
StrAssign(s1,sa);
cout<<"请输入串s2:
";
cin>>b;
sb=b;
StrAssign(s2,sb);
Concat(t,s1,s2);
cout<<"s1与s2合并后:
";
Display(t);
break;
}
case4:
{
HStringsub,s;
chara[20];
char*sa;
intpos,len;
cout<<"请输入主串s:
";
cin>>a;
sa=a;
StrAssign(s,sa);
cout<<"请输入所取原串的起始位置pos:
";
cin>>pos;
cout<<"请输入子串的长度len:
";
cin>>len;
SubString(sub,s,pos,len);
cout<<"该子串为:
";
Display(sub);
break;
}
case5:
{
HStrings,t;
intvalue;
chara[20],b[20];
char*sa,*sb;
cout<<"请输入串s:
";
cin>>a;
sa=a;
StrAssign(s,sa);
cout<<"请输入串t:
";
cin>>b;
sb=b;
StrAssign(t,sb);
value=StrCompare(s,t);
if(value>0)cout<<"串s大于串t"<elseif(value==0)cout<<"串s等于串t"<elsecout<<"串s小于串t"<cout<break;
}
case6:
HStrings;charstr[20];char*chars;intval;
cout<<"请输入串s:
";
cin>>str;
chars=str;
StrAssign(s,chars);
val=StrLen(s);
cout<<"串的长度为:
"<case7:
cout<<"操作结束!
"<default:
cout<<"输入错误!
请重新输入!
"<}
}while(i!
=7);
3.KMP算法的C实现
#include
#include
#include
structHString
{
char*ch;
intlength;
};
voidStrAssign(HString&t,char*chars)
{
inti;
char*c;
for(i=0,c=chars;*c;++i,++c);
if(!
i)
{
t.ch=NULL;
t.length=0;
}
else
{
t.ch=(char*)malloc(i*sizeof(char));
for(intj=0;j
t.ch[j]=chars[j];
t.length=i;
}
}
voidget_next(HStrings,intnext[])
{
inti,j;
i=1;j=0;
next[1]=0;
while(i{
if(j==0||s.ch[i-1]==s.ch[j-1])
{
i++;j++;next[i]=j;
}
elsej=next[j];
}
for(i=1;next[i]!
='\0';i++)
cout<}
intIndex(HStrings,HStringt,intpos)
{
inti=pos;
intj=1;
intnext[20];
get_next(t,next);
while(i<=s.length&&j<=t.length)
{
if(s.ch[i-1]==t.ch[j-1]||j==0)
{++i;++j;}
else
{
j=next[j];
}
}
if(j>t.length)
returni-t.length;
elsereturn0;
}
voidDisplay(HStringt)
{
for(inti=0;icout<cout<}
voidmain()
{HStrings,t;
intpos,k;
chara[20],b[20];
char*sa,*sb;
cout<<"请输入主串s:
";
cin>>a;
sa=a;
StrAssign(s,sa);
cout<<"请输入模式串t:
";
cin>>b;
sb=b;
StrAssign(t,sb);
cout<<"请输入起始位置pos:
";
cin>>pos;
k=Index(s,t,pos);
if(k==0)
cout<<"匹配失败!
"<else
{cout<<"从第"<Display(s);
for(inti=1;icout<<"";
Display(t);}
}
【小结讨论】
1.此程序关键在于位置查询,由于对C语言函数的陌生导致问题变的繁琐,自己的C语言水平有待提高。
2.对于串不能想当然的用gets()输入puts()输出,这是不对的,对输入我们可以利用串赋值初始化串,输出则就利用一个普通的循环输出。
3在定义函数时.一些需要加“&”使用引用的一定要加否则会导致程序运行错误。
北京联合大学
实训报告
课程(项目)名称:
数据结构
学院:
专业:
班级:
学号:
姓名:
成绩:
2012年 6 月 21 日
数据结构实训任务一
一、任务与目的:
1、用顺序表表示两个无序集合A、B,实现集合的如下操作,求两个集合的并集、交集、差集。
2、用顺序表表示两个集合A、B(集合A、B都是有序递增的情况)实现集合的如下操作,求两个集合的并集、交集、差集。
3、用带头单链表存储结构表示两个无序集合A、B,实现集合的如下操作,求两个集合的并集、交集、差集。
4、用带头单链表存储结构表示两个集合A、B(集合A、B都是有序递增的情况),实现集合的如下操作,求两个集合的并集、交集、差集。
5、杀人游戏N个人坐成一圈玩杀人游