#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;
}

请帮忙指正!编译后有十一项错误