#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
//串的结构体
typedef struct
{
char str[MAXSIZE];
int len;
}SeqString;
//初始化串
SeqString *InitString(SeqString *S)
{
S=(SeqString *)malloc(sizeof(SeqString));
S->len=0;
return S;
}
//求串长
int StrLen(SeqString *S)
{
return S->len;
}
//创建顺序串
void CreatString(SeqString *S)
{
char str[MAXSIZE];
printf("Input String:");
gets(str);
while(str[S->len]!='\0')
{
S->str[S->len]=str[S->len];
S->len++;
}
S->str[S->len]='\0';
}
//遍历顺序串
void TraverseSting(SeqString *S)
{
puts(S->str);
}
//复制顺序串
SeqString *StrCopy(SeqString *S,SeqString *s)
{
int i;
s=InitString(s);
for(i=0;i<=S->len;i++)
{
s->str[i]=S->str[i];
}
s->len=S->len;
return s;
}
//求顺序串子串
SeqString *SubStr(SeqString *S,int pos,int len,SeqString *Sub)
{
Sub=InitString(Sub);
int i;
if(pos<1||pos>S->len||len<0||len>S->len-pos-1)
{
printf("Position or len error!\n");
return 0;
}
for(i=0;i<len;i++)
{
Sub->str[i]=S->str[pos+i-1];
}
Sub->str[i]='\0';
Sub->len=len;
return Sub;
}
//删除顺序串子串
SeqString *DeleteStr2(SeqString *S,int pos,int len)
{
int i;
if(pos<1||pos>S->len||len<0||len>S->len-pos+1)
{
printf("Position or len error!\n");
return 0;
}
for(i=pos+len-1;i<S->len;i++)
{
S->str[i-len]=S->str[i];
}
S->len=S->len-len;
S->str[S->len]='\0';
return S;
}
//KMP算法-next数组
void get_next(SeqString *S,int *next)
{
int i=1,j=0;
next[1]=0;
while(i<S->len)
{
if(j==0||S->str[i]==S->str[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int Index_kmp(SeqString *S,SeqString *t)
{
int i=1,j=1;
int next[MAXSIZE];
get_next(S,next);
t=InitString(t);
CreatString(t);
while(i<=S->len&&j<=t->len)
{
if(j==0||S->str[i-1]==t->str[j-1])
{
++i;
++j;
}
else
j=next[j];
}
if(j>t->len)
{
printf("%d!\n",i-t->len);
return i-t->len;
}
else
return 0;
}
//主函数
int main()
{
SeqString *S;
S=InitString(S);
CreatString(S);
}
串(顺序串)
最新推荐文章于 2023-11-15 17:42:04 发布