数据结构实验报告串与模式匹配.docx
- 文档编号:27950582
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:15
- 大小:71.56KB
数据结构实验报告串与模式匹配.docx
《数据结构实验报告串与模式匹配.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告串与模式匹配.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构实验报告串与模式匹配
数据结构实验报告
实验名称
串
班级
0901
姓名
高傲
学号
20091185015
日期
2011128
实验目的:
(1)掌握顺序串的各种基本运算
(2)掌握模式匹配算法
实验内容:
2.1编写一个程序algo3-1.cpp,实现顺序串的各种基本运算,并在此基础上设计一个主函数完成如下功能:
(1)建立串s=”abcdefghefghijklmn”和串s1=”xyz”;
(2)输出串s;
(3)输出串s的长度;
(4)在串s的第9个字符位置插入串s1而产生串s2;
(5)输出串s2;
(6)删除串s第2个字符开始的5个字符而产生串s2;
(7)输出串s2;
(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2;
(9)输出和串s2.
(10)提取串s的第2个字符开始的10个字符而产生串s3;
(11)输出串s3;
(12)将串s1和串s2连接起来而产生串s4;
(13)输出串s4。
程序源代码:
2.1的源程序:
#include
#defineMAXSIZE256
//chars[MAXSIZE];
//求串长
intStrLength(char*s)
{
inti=0;
while(s[i]!
='\0')
i++;
return(i);
}
//串联接
intStrConcat(char*s1,char*s2,char*s)
{
inti=0,j,len1,len2;
len1=StrLength(s1);
len2=StrLength(s2);
if(len1+len2>MAXSIZE-1)
return(0);
j=0;
while(s1[j]!
='\0')
{
s[i]=s1[j];
i++;
j++;
}
j=0;
while(s2[j]!
='\0')
{
s[i]=s2[j];
i++;
j++;
}
s[i]='\0';
return
(1);
}
//求子串
intStrSub(char*t,char*s,inti,intlen)
{
intslen,j;
slen=StrLength(s);
if(i<1||i>slen||len<0||len>slen-i+1)
{
printf("参数不对");
return(0);
}
for(j=0;j t[j]=s[i+j-1]; t[j]='\0'; return (1); } //串比较 intStrCmp(char*s1,char*s2) { inti=0; while(s1[i]==s2[i]&&s1[i]! ='\0') i++; return(s1[i]==s2[i]); } //输出串 voidDisp_Str(char*s) { inti; for(i=0;i { printf("%c",s[i]); } printf("\n"); } //插入串并保存到新串中 intStrInsert(char*s,char*s1,inti,char*s2) { intj=0,k,lens1,lens; lens=StrLength(s); lens1=StrLength(s1); for(k=0;k { s2[j]=s[k]; j++; } for(intl=0;l { s2[j]=s1[l]; j++; } for(intm=k;m { s2[j]=s[m]; j++; } s2[j]='\0'; return (1); } //删除串中元素并保存到新串中 intStrDelete(char*s,char*s2,inta,intb) { inti=0,lens=StrLength(s); for(intj=0;j<(a-1);j++) { s2[i]=s[j]; i++; } for(intk=(a+b-1);k { s2[i]=s[k]; i++; } s2[i]='\0'; return (1); } //用一个串替代另一个串中部分字符并保存到新串中 intTiDaiStr(char*s,char*s1,char*s2,inta,intb) { inti=0,lens,lens1; lens=StrLength(s); lens1=StrLength(s1); for(intj=0;j { s2[i]=s[j]; i++; } for(intk=0;k { s2[i]=s1[k]; i++; } for(intl=(a+b-1);l { s2[i]=s[l]; i++; } s2[i]='\0'; return (1); } intmain(void) { printf(" (1)建立串s=abcdefghefghijklmn和s1=xyz\n"); chars[MAXSIZE]="abcdefghefghijklmn"; chars1[MAXSIZE]="xyz"; printf(" (2)输出串s="); Disp_Str(s); printf("(3)输出串s的长度: %d\n",StrLength(s)); printf("(4)在串s的第9个字符位置插入串s1而产生s2\n"); chars2[MAXSIZE]; StrInsert(s,s1,9,s2); printf("(5)输出串s2="); Disp_Str(s2); printf("(6)删除串s第2个字符开始的5个字符而产生串s2\n"); StrDelete(s,s2,2,5); printf("(7)输出串s2: "); Disp_Str(s2); printf("(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n"); TiDaiStr(s,s1,s2,2,5); printf("(9)输出s2="); Disp_Str(s2); printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n"); printf("(11)输出s3="); chars3[MAXSIZE]; StrSub(s3,s,2,10); Disp_Str(s3); printf("(12)将串s1和串s2连接起来而产生串s4\n"); chars4[MAXSIZE]; StrConcat(s1,s2,s4); printf("(13)输出串s4="); Disp_Str(s4); getchar(); return(0); } 2.2 #include #definemaxsize256 chars[maxsize]; chart[100]; intnext[maxsize]; //求串长 intStrLength(char*s) { inti=0; while(s[i]! ='\0') i++; return(i); } intChange(char*s) { inti; for(i=StrLength(s)-1;i>=0;i--) { s[i+1]=s[i]; } s[0]=StrLength(s); return (1); } //简单模式匹配 intStrIndex_Bf(char*s,char*t) { inti=1,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]) return(i-t[0]); else return-1; } //输出next值 intDis_next(intnext[],char*t) { inti; for(i=1;i<=t[0];i++) { printf("%d",next[i]); } printf("\n"); returnnext[i]; } //模式串求next值 voidGetnext(char*t,intnext[]) { inti=1,j=0; next[1]=0; while(i { if(j==0||t[i]==t[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } } //采用KMP算法求t在s中的位置 intSerIndex_KMP(char*s,char*t,intpos,intnext[]) { inti=pos,j=1; while(i<=s[0]&&j<=t[0]) if(j==0||s[i]==t[j]) { i++; j++; } else j=next[j]; if(j>t[0]) returni-t[0]; else return-1; } intmain(void) { printf(" (1)建立abcabcdabcdeabcdefabcdefg目标串s和abcdeabcdefab模式串t\n"); chars[]="abcabcdabcdeabcdefabcdefg"; chart[]="abcdeabcdefab"; Change(s); Change(t); printf(" (2)简单模式匹配求t在s中的位置: %d\n",StrIndex_Bf(s,t)); printf("(3)由模式串t求出next值next="); intnext[maxsize]; Getnext(t,next); Dis_next(next,t); printf("(4)采用KMP算法求t在s中的位置: %d\n",SerIndex_KMP(s,t,1,next)); } 2.2源程序: #include #definemaxsize256 chars[maxsize]; chart[100]; intnext[maxsize]; //求串长 intStrLength(char*s) { inti=0; while(s[i]! ='\0') i++; return(i); } intChange(char*s) { inti; for(i=StrLength(s)-1;i>=0;i--) { s[i+1]=s[i]; } s[0]=StrLength(s); return (1); } //简单模式匹配 intStrIndex_Bf(char*s,char*t) { inti=1,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]) return(i-t[0]); else return-1; } //输出next值 intDis_next(intnext[],char*t) { inti; for(i=1;i<=t[0];i++) { printf("%d",next[i]); } printf("\n"); returnnext[i]; } //模式串求next值 voidGetnext(char*t,intnext[]) { inti=1,j=0; next[1]=0; while(i { if(j==0||t[i]==t[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } } //采用KMP算法求t在s中的位置 intSerIndex_KMP(char*s,char*t,intpos,intnext[]) { inti=pos,j=1; while(i<=s[0]&&j<=t[0]) if(j==0||s[i]==t[j]) { i++; j++; } else j=next[j]; if(j>t[0]) returni-t[0]; else return-1; } intmain(void) { printf(" (1)建立abcabcdabcdeabcdefabcdefg目标串s和abcdeabcdefab模式串t\n"); chars[]="abcabcdabcdeabcdefabcdefg"; chart[]="abcdeabcdefab"; Change(s); Change(t); printf(" (2)简单模式匹配求t在s中的位置: %d\n",StrIndex_Bf(s,t)); printf("(3)由模式串t求出next值next="); intnext[maxsize]; Getnext(t,next); Dis_next(next,t); printf("(4)采用KMP算法求t在s中的位置: %d\n",SerIndex_KMP(s,t,1,next));char getchar(); return(0); } 运行结果: 实验结果分析:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 模式 匹配