学号 E22214006 专业 软件工程 姓名 郭晨坡
实验日期 2023.6.1 教师签字 成绩
实验报告三
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int next[30],nextval[30];
typedef int Status;
#define OK 1
#define ERROR 0
//串的堆分配存储表示
typedef struct //参考书Pg. 75
{
char *ch;//若串是非空,则按照串长分配存储区,否者ch为NULL
int length;//串长度
}HString;
Status StrAssign(HString &T,char * Str)
{//请补充你的代码:生成一个其值等于Str的串T
int len=strlen(Str);
T.ch =(char*)malloc(sizeof(char)*len);
int i;
strcpy(T.ch ,Str);
T.length =len;
return OK;
}
Status ClearString(HString &T)
{//请补充你的代码:将S清空为空串
T.length=0;
free(T.ch);
T.ch =NULL;
return OK;
}
Status Concat(HString &T, HString S1, HString S2)
{//请补充你的代码:用T返回S1和S2联接而成的新串
T.ch =(char*)malloc(sizeof(char)*(S1.length +S2.length ));
T.length =S1.length +S2.length ;
strcpy(T.ch ,S1.ch );
strcat(T.ch ,S2.ch );
return OK;
}
Status SubString(HString &Sub, HString S, int pos, int len)
{//请补充你的代码:用Sub返回串S的第pos个字符起长度为len的子串
Sub.ch =(char*)malloc(sizeof(char)*len );
for(int i=0;i<len;i++)
{
Sub.ch [i]=S.ch [pos+i-1];
}
Sub.length =len;
return OK;
}
void get_next(HString T,int next[])//求模式串T的next函数值并存入数组next中
{
int i=1,j=0;next[1]=0;
while(i<T.length)
{
if(j==0||T.ch [i-1]==T.ch[j-1])
{
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(HString T,int next[],int nextval[])
//求模式串T的nextval函数值并存入数组nextval中
{
int i=1;
nextval[1]=0;
while(i<T.length )
{
if(T.ch[i]==T.ch [next[i+1]-1])
nextval[i+1]=nextval[next[i+1]];
else
nextval[i+1]=next[i+1];
i++;
}
}
Status Index_KMP(HString S, HString T, int pos)//主函数,参考课本 Pg 82
{//请补充你的代码: 实现KMP算法,返回子串T在主串S中第pos个字符之后的位置。
//若不存在,则函数值为0,其中,T非空,1<=pos<=StrLength(S)
int i=pos,j=1;
while(i<=S.length &&j<=T.length )
{
if(j==0||S.ch [i-1]==T.ch[j-1])
{
++i;++j;
}
else j=next[j];
}
if(j>T.length )
return i-T.length ;
else
return ERROR;
}
//主函数
int main(int argc,char* argv[])
{
char * str1="I am from Anhui University.";
char * str2="I am 20 years old!";
HString S1,S2,S3,Sub;
//请补充你的代码: 调用StrAssign(),用str1赋值给S1,str2赋值给S2,并且屏幕输出S1和S2 (S1:I am from Anhui University. S2: I am 20 years old! )
StrAssign(S1,str1);StrAssign(S2,str2);
printf("S1:%sS2:%s\n",S1.ch ,S2.ch );
//请补充你的代码:调用Concat(),联接S1和S2,生成S3,并且屏幕输出S3 (S3:I am from Anhui University. I am 20 years old!)
Concat(S3, S1, S2);
printf("S3:%s\n",S3.ch );
//请补充你的代码:调用SubString(Sub,S1,11,5),屏幕输出Sub (Sub: Anhui)
SubString(Sub,S1,11,5);
printf("Sub:%s\n",Sub.ch );
//请补充你的代码:调用Index_KMP(S3,Sub,1),屏幕输出Sub在S3出现的位置 (11)
get_next(Sub,next);
get_nextval(Sub,next,nextval);
printf("%d",Index_KMP(S3,Sub,1));
//请补充你的代码:调用ClearString,释放S1,S2,S3,Sub
ClearString(S1);
ClearString(S2);
ClearString(S3);
ClearString(Sub);
return 1;
}