主题:请帮忙看个程序(求一个字符串的最大重复子串)用next函数做
#include<stdio.h>
#define OVERFLOW -2
#define OK 1
#define ERROR -1
typedef struct{
char *ch;
int length;
}HString;
int * get_next(HString *T,int next[]){//KMP算法的next函数
int i,j;
next[1]=0; i=1;j=0;
while(i<(*T).length){
if(j==0||(*T).ch[i]==(*T).ch[j]){++i;++j;
if((*T).ch[i]!=(*T).ch[j])next[i]=j;
else next[i]=next[j];
}
else j=next[j];}
return next;
}
int CreatString(HString *S){ //用堆分配建立串
char str[100];
printf("请输入字符串:");
scanf("%s",str)
for(int i=0;str[i]!='\0';i++);
if(!i)print("重新输入字符串:");
else{
if(!((*S).ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
(*S).length=i;
for(i=0;i<(*S).length;(*S).ch[i]=str[i]);
}
return OK;
}
HString *SubString(HString *Sub,HString *S,int pos,int len){
if(pos<1||pos>(*S).length||len<0||len>(*S).length-pos+1)
return ERROR;
if((*Sub).ch) free((*Sub).ch);
if(!len){(*Sub).ch=NULL;(*Sub).length=0;}
else{
(*Sub).ch=(char*)malloc(len*sizeof(char));
for(int i=0,int j=pos-1;i<=len-1;i++,j++)
(*Sub).ch[i]=(*S).ch[j];
(*Sub).length=len;
}
return Sub;
}
main(){
int i,n,pos,*p,maxl,maxk;
HString *S,*Sub;
CreatString(S);
i=1;maxl=0;maxk=0; n=(*S).length;pos=0;
while(n-i+1>maxl){//
p=get_next(SubString(S,Sub,i,n-i+1),int next[]);//求每一个子串的next[]
for(int k=0;k<=n-i+1;k++){//求S主串中所有子串的next[]的最大值
if(*(p)>=*(p+1))
maxk=*(p);
else maxk=*(p+1);
p++;
}
if(maxk!=next[n]||(*S).ch[n-1]!=(*S).ch[i+maxk-1])
maxk--;
if(maxk>maxl){maxl=maxk;pos=i;}//maxl最大子串的字符个数,pos是位置
i++; } //while
printf("%d %d",maxl,pos);
return OK;
}
请帮忙指正!编译后有十一项错误
#define OVERFLOW -2
#define OK 1
#define ERROR -1
typedef struct{
char *ch;
int length;
}HString;
int * get_next(HString *T,int next[]){//KMP算法的next函数
int i,j;
next[1]=0; i=1;j=0;
while(i<(*T).length){
if(j==0||(*T).ch[i]==(*T).ch[j]){++i;++j;
if((*T).ch[i]!=(*T).ch[j])next[i]=j;
else next[i]=next[j];
}
else j=next[j];}
return next;
}
int CreatString(HString *S){ //用堆分配建立串
char str[100];
printf("请输入字符串:");
scanf("%s",str)
for(int i=0;str[i]!='\0';i++);
if(!i)print("重新输入字符串:");
else{
if(!((*S).ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
(*S).length=i;
for(i=0;i<(*S).length;(*S).ch[i]=str[i]);
}
return OK;
}
HString *SubString(HString *Sub,HString *S,int pos,int len){
if(pos<1||pos>(*S).length||len<0||len>(*S).length-pos+1)
return ERROR;
if((*Sub).ch) free((*Sub).ch);
if(!len){(*Sub).ch=NULL;(*Sub).length=0;}
else{
(*Sub).ch=(char*)malloc(len*sizeof(char));
for(int i=0,int j=pos-1;i<=len-1;i++,j++)
(*Sub).ch[i]=(*S).ch[j];
(*Sub).length=len;
}
return Sub;
}
main(){
int i,n,pos,*p,maxl,maxk;
HString *S,*Sub;
CreatString(S);
i=1;maxl=0;maxk=0; n=(*S).length;pos=0;
while(n-i+1>maxl){//
p=get_next(SubString(S,Sub,i,n-i+1),int next[]);//求每一个子串的next[]
for(int k=0;k<=n-i+1;k++){//求S主串中所有子串的next[]的最大值
if(*(p)>=*(p+1))
maxk=*(p);
else maxk=*(p+1);
p++;
}
if(maxk!=next[n]||(*S).ch[n-1]!=(*S).ch[i+maxk-1])
maxk--;
if(maxk>maxl){maxl=maxk;pos=i;}//maxl最大子串的字符个数,pos是位置
i++; } //while
printf("%d %d",maxl,pos);
return OK;
}
请帮忙指正!编译后有十一项错误