兰州大学数据结构实验实习三实验报告Word下载.docx
- 文档编号:16357721
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:14
- 大小:57.78KB
兰州大学数据结构实验实习三实验报告Word下载.docx
《兰州大学数据结构实验实习三实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《兰州大学数据结构实验实习三实验报告Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
根据题目要求与提示输入一个模式串P和三个主串
2、输出的形式:
输出模式串NEXT[]数组,和模式串在三个主串中的位置
3、程序所能达到的功能:
确定模式串在主串中的位置
4、测试数据:
首先输入模式串,以回车结束,此时输出NEXT[]数组的值。
再输入三个主串,每输入一个主串,就会显示出模式串在主串中的位置。
例如:
输入模式串:
ababc
显示出NEXT的值为:
-10012
输入主串:
ababcjkluioababc
输出模式串在主串中的位置:
011
然后在依次输入剩下两个主串,每个主串的长度为15~25,模式串的长度5~8
五、概要设计
为了实现上述操作,应以链表为存储结构。
1、基本操作:
(1)voidgetnext(char*t,int*next)
初始条件:
存在一个char型的数组t,和一个初始的int型数组next[];
操作结果:
无返回值,把模式串的本身匹配的结果存入next数组中
(2)intkmp(char*s,char*t,int*next,int*m)
存在主串s,模式串t,主串的匹配数组next,以及记录模式串在主串位置的数组m;
返回模式串在主串位置的总数k。
2、本程序包含三个个模块:
(1)求模式串匹配数组next;
(2)实现KMP算法模块
(3)主程序模块
(3)模块调用图:
主程序模块
求得模式串匹配数组模块
实现KMP算法模块
3、流程图
主函数的流程图
定义chars1[25],s2[25],s3[25],t[8]
intm[10],next[8],i,count
屏幕上输出“请输入模式串”
调用get()函数得到模式串t
调用函数getnext,求得模式串的匹配串next
当i小于模式串t长度(i的初始值赋值为0)
输出next数组
屏幕上输出“请输入比较串:
”
调用函数get(),得到主串s1
调用函数KMP,函数返回模式串在主串中的位置的总数k,记录位置的是int型数组m
Count=k
当i小于count时(i的初始值赋值为0)
输出m数组
调用函数get(),得到主串s2
调用函数get(),得到主串s3
getnext函数流程图
函数输入模式串数组t和初始化的模式串匹配串数组next
inti=0,j=-1
next[0]=-1
当t[i]!
='
\0'
时
j==-1)||(t[i]==t[j]
是
否
i++
j=next[j]
j++
next[i]=j
kmp函数流程图
函数调用需要主串s,模式串t,模式串匹配串next,以及记录模式串在主串位置的记录串m
inti=0,j=0,k=0
当s[i]!
j==-1)||(s[i]==t[j]
j=next[j]
m[k++]=i-strlen(t)
j=-1
i--
returnk
六、详细设计
1、存储类型,元素类型,结点类型:
在整个程序中,三个主串和一个模式串均使用的是字符串数组类型
模式串匹配数组,以及记录模式串在主串位置的记录数据用的是整形数组类型,其余用到的是整形数据类型
2、每个模块的分析:
(1)主程序模块:
voidmain()
{
chars1[25],s2[25],s3[25],t[8];
intm[10],next[8],i,count;
printf("
请输入模式串:
"
);
gets(t);
//得到模式串
getnext(t,next);
//调用getnext函数,求得模式串匹配串next
for(i=0;
i<
strlen(t);
i++)//输出next
{
printf("
%d"
next[i]);
}
\n请输入比较串:
gets(s1);
\n"
count=kmp(s1,t,next,m);
//调用kmp函数,利用m数组记录模式串位置,返回记录数据的总数
count;
i++)
%d"
m[i]);
//对m数组进行输出
gets(s2);
count=kmp(s2,t,next,m);
gets(s3);
count=kmp(s3,t,next,m);
}
(2)求模式串匹配串模块
voidgetnext(char*t,int*next)
inti=0,j=-1;
next[0]=-1;
//-1意义为:
模式串第一位不匹配,主串直接向后移一位,然后在从头开始比较
while(t[i]!
)//循环到模式串t进行到结尾
if((j==-1)||(t[i]==t[j]))
{
i++;
//继续比较后继字符
j++;
next[i]=j;
}
else
j=next[j];
//模式串向后移动
intkmp(char*s,char*t,int*next,int*m)
inti=0,j=0,k=0;
while(s[i]!
)
if((j==-1)||(s[i]==t[j]))//判断是否匹配
i++;
//模式串向右移动
if(t[j]=='
)//匹配成功
m[k++]=i-strlen(t);
//确定模式串在主串中的位置
j=-1;
//重新初始,使模式串和主串再进行比较
i--;
//主串位置向前移一位
returnk;
//返回记录位置的总数
3)函数调用关系图
main()
voidgetnext
intkmp(char*s,char*t,int*next,int*m)
3、完整的程序:
#include"
stdio.h"
string.h"
if((j==-1)||(t[i]==t[j]))
if((j==-1)||(s[i]==t[j]))
m[k++]=i-strlen(t);
七、程序使用说明及测试结果
1、程序使用说明
(1)本程序的运行环境为VC6.0。
(2)进入演示程序后即显示提示信息:
程序会提示输入一个模式串,然后显示出next数组的值。
然后提醒输入一个主串,屏幕中会显示出模式串在主串中的位置。
依照上面顺序会要求再输入两个主串
2、测试结果:
输入:
ababa
输出:
-10012
qweasdzxcababa
9
ababcasdababc
(注:
屏幕上没显示内容)
ababaaweababac
08
程序结束
3、调试中的错误及解决办法。
刚开始程序出现很多错误,开始是KMP算法不是很理解,随后解决。
后面对于KMP函数实现模块的返回值,存在异议。
本来想用递归调用,结果发现递归的思路不是很清新,于是换了另外一种方式。
利用一个记录数据总数的变量count,再用指针的方法,传入记录位置的数组m,函数返回的是记录诗句总数的变量count,利用循环的方法进行输出,输出数组m的前count元素,通过这种方法,实现功能
运行界面
先输入ababa后,回车:
再输入qweasdzxcababa后回车:
再输入:
ababcasdababc后回车
最后输入:
ababaaweababac后回车
八、实验小结:
你在编程过程中花时多少?
花了近乎5,6个小时
多少时间在纸上设计?
3,4
多少时间上机输入和调试?
1,2
多少时间在思考问题?
3,4,在纸上设计的同时思考问题
遇到了哪些难题?
首先是KMP算法的实现
然后是KMP算法的应该怎么返回值,返回何种值
你是怎么克服的?
KMP算法是从课本上找到了解决方法
返回值的问题,我通过换了另外一种思路,利用指针最终实现了功能
你的收获有哪些?
学习了KMP算法
加深对指针的操作
发现自己对于递归的实现方法还不是很熟悉
签名:
日期:
实验成绩:
批阅日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兰州大学 数据结构 实验 实习 报告