您的位置:首页 > 理论基础 > 数据结构算法

数据结构串的实现以及KMP改进算法

2015-04-28 18:38 323 查看
</pre><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40 /* 存储空间初始分配量 */
typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char String[MAXSIZE+1]; /*  0号单元存放串的长度 */
/*  输出字符串T */
void StrPrint(String T)
{
int i;
for(i=1;i<=T[0];i++)
printf("%c",T[i]);
printf("\n");
}
/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);//T[0]存储串的长度
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
/* 返回串的元素个数 */
int StrLength(String S)
{
return S[0];
}

/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */
int StrCompare(String S,String T)
{
int i;
for(i=1;i <=S[0]&&i<=T[0];++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
int i;
if(S1[0]+S2[0]<=MAXSIZE)
{ /*  未截断 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=S2[0];i++)
T[S1[0]+i]=S2[i];
T[0]=S1[0]+S2[0];
return TRUE;
}
else
{ /*  截断S2 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=MAXSIZE-S1[0];i++)
T[S1[0]+i]=S2[i];
T[0]=MAXSIZE;
return FALSE;
}
}

/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
int i;
if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1)
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return OK;
}
void get_next(String T,int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{

i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
void get_nextval(String T,int *nextval)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{

i++;
j++;
if(j==0||T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
{
j=nextval[j];
}
}
}
int Index_KMP(String S,String T,int pos)
{
int i=pos;//从pos位置开始
int j=1;
int next[255];//定义一组next数组
//get_next(T,next);
get_nextval(T,next);
while(i<=S[0]&&j<=T[0])
{

if(j==0||S[i]==T[j])
{

++i;
++j;
}
else
{

j=next[j];
}

}
if(j>T[0])
{
return i-T[0];
}
else
return 0;
}
int main()
{
String S,T;
char *s="acdefgab";
char *t="ab";
StrAssign(S,s);
StrAssign(T,t);
int a= Index_KMP(S,T,1);
printf("%d",a);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: