数据结构串实验报告Word文档格式.docx
《数据结构串实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构串实验报告Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
程序代码:
4-19的代码:
/*静态存储结构*/
typedefstruct
{
charstr[MaxSize];
intlength;
}String;
/*初始化操作*/
voidInitiate(String*S){
S->
length=0;
}
/*插入子串操作*/
intInsert(String*S,intpos,StringT)
/*在串S的pos位置插入子串T*/
inti;
if(pos<
0||pos>
length)
printf("
Theparameterposiserror!
\n"
);
return0;
elseif(S->
length+T.length>
MaxSize)
Thespaceofthearrayisnotenough!
else
for(i=S->
length-1;
i>
=pos;
i--)
str[i+T.length]=S->
str[i];
/*依次后移数据元素*/
for(i=0;
i<
T.length;
i++)
str[pos+i]=T.str[i];
/*插入*/
length=S->
length+T.length;
/*产生新的串长度值*/
return1;
/*删除子串操作*/
intDelete(String*S,intpos,intlen)/*删除串S的从pos位置开始长度为len的子串值*/
if(S->
length<
=0)
Noelementsdeleting!
elseif(pos<
0||len<
0||pos+len>
Theparametersposandlenarenotcorrect!
for(i=pos+len;
=S->
str[i-len]=S->
/*依次前移数据元素*/
length-len;
/*取子串操作*/
intSubString(StringS,intpos,intlen,String*T)
/*取串S的从pos位置开始长度为len的子串值赋给子串T*/
S.length)
=len;
T->
str[i]=S.str[pos+i];
/*给子串T赋值*/
length=len;
/*给子串T的长度域赋值*/
/*查找子串BF(Brute-Force)操作*/
intBFIndex(StringS,intstart,StringT)
/*查找主串S从start开始的子串T,找到返回T在S中的开始字符下标,否则返回-1*/{
inti=start,j=0,v;
while(i<
S.length&
&
j<
T.length)
if(S.str[i]==T.str[j])
i++;
j++;
i=i-j+1;
j=0;
if(j==T.length)
v=i-T.length;
v=-1;
returnv;
/*查找子串KMP(D.E.Knuth-J.H.Morris-V.R.Pratt)操作*/intKMPIndex(StringS,intstart,StringT,intnext[])
/*查找主串S从start开始的子串T,找到返回T在S中的首字符下标,*/
/*否则返回-1*/
/*数组Next中存放有模式串T的next[j]值*/
elseif(j==0)i++;
elsej=next[j];
/*求模式串next[j]值的操作*/
voidGetNext(StringT,intnext[])
/*求子串T的next[j]值并存放于数组next中*/
intj=1,k=0;
next[0]=-1;
next[1]=0;
while(j<
if(T.str[j]=T.str[k])
next[j+1]=k+1;
k++;
elseif(k==0)
next[j+1]=0;
elsek=next[k];
/*查找子串BF(Brute-Force)算法累计次数*/
intBFIndexC(StringS,intstart,StringT)
/*查找主串S从start开始的子串T,找到返回T在S中的开始字符下标,否则返回-1*/
inti=start,j=0,t=0;
t++;
returnt;
/*查找子串KMP(D.E.Knuth-J.H.Morris-V.R.Pratt)操作*/intKMPIndexC(StringS,intstart,StringT,intnext[])
/*查找主串S从start开始的子串T,找到返回T在S中的首字符下标,*//*否则返回-1*/
elseif(j==0)
测试主函数:
#include<
stdio.h>
#defineMaxSize100
#include"
SString.h"
BFandKMP.h"
voidmain(void)
StringS={{"
cddcdc"
},6},T={{"
abcde"
},5};
StringS1={{"
aaaaaaaa"
},8},T1={{"
aaaab"
StringS2={{"
aaaaaaaaaaaaaaaaad"
},18},T2={{"
intnext[20],count;
count=BFIndexC(S,0,T);
从S中查找T的Brute-Force算法比较次数:
%d\n"
count);
GetNext(T,next);
count=KMPIndexC(S,0,T,next);
从S中查找T的KMP算法比较次数:
count=BFIndexC(S1,0,T1);
从S1中查找T1的Brute-Force算法比较次数:
GetNext(T1,next);
count=KMPIndexC(S1,0,T1,next);
从S1中查找T1的KMP算法比较次数:
count=BFIndexC(S2,0,T2);
从S2中查找T2的Brute-Force算法比较次数:
GetNext(T2,next);
count=KMPIndexC(S2,0,T2,next);
从S2中查找T2的KMP算法比较次数:
4-20的部分代码:
Replace函数:
/*从主串S中查找字串T,若存在,并用串V替换串T并返回1,否则,返回0*/intReplace(StringS,intstart,StringT,StringV)
inti,v;
Initiate(&
S);
T);
V);
strlen(S.str);
S.length=S.length+1;
strlen(T.str);
T.length=T.length+1;
strlen(V.str);
V.length=V.length+1;
i=BFIndex(S,0,T);
if(i!
=-1)
if(Delete(&
S,i,T.length))
Insert(&
S,i,V);
S.length;
%c"
S.str[i]);
returnv=1;
主串S中不存在串T\n"
returnv=0;
#defineMaxSize80
string.h>
#include"
intmain(void)
{intv;
StringS={"
Iamastudent."
},T={"
student"
},V={"
teacher"
};
v=Replace(S,0,T,V);
返回%d\n"
v);
实验结果:
4-19.程序调式结果:
4-20.程序调式结果:
总结与思考
KMP算法的比较次数比Brute-Force算法的少。
KMP算法的主要特点是:
消除了Brute-Force算法的主串指针在相当多个字符比较相等后,只要有一个字符不相等便回退,也就是回溯的缺点。
所以从两种算法的原理和程序运行的结果来看,KMP算法比Brute-Force算法的效率更高。