修正KMP算法 顺序串操作

来源:互联网 发布:淘宝卖家管控记录 编辑:程序博客网 时间:2024/06/05 17:46

课下练习

/*整型数据最好不要用  引用传参*/#include<stdio.h>#include<stdlib.h>#define MaxSize 100typedef struct{    char data[MaxSize];    int length;} SqString;//初始化串void InitString(SqString* &s){    s=(SqString*)malloc(sizeof(SqString));    s->length=0;}//生成一个与str串相等的s串void StrAssign(SqString* &s,char str[]){    int i;    for(i=0; str[i]!='\0'; i++)    {        s->data[i]=str[i];    }    s->data[i]='\0';    s->length=i;//不包括字符串最后一个空字符}//将串t复制给串svoid StrCopy(SqString* &s,SqString* &t){    int i;    for(i=0; i<t->length; i++)    {        s->data[i]=t->data[i];    }    s->data[i]='\0';    s->length=t->length;}//判断两个串是否相等bool StrEqual(SqString* &s,SqString* &t){    int i=0;    if(s->length!=t->length)        return false;    else    {        for(i=0; i<s->length; i++)        {            if(s->data[i]!=t->data[i])            {                return false;                break;            }        }        return true;    }}//返回串中的字符数int StrLength(SqString* &s){    return s->length;}//将串s和串t连接在一起SqString* Concat(SqString* &s,SqString* &t){    int i,j=0;    SqString *p;    InitString(p);    for(i=0; i<s->length; i++)    {        p->data[i]=s->data[i];    }    for(i=s->length; i<s->length+t->length; i++,j++)    {        p->data[i]=t->data[j];    }    p->data[s->length+t->length]='\0';    p->length=s->length+t->length;    return p;}//求子串:返回串s中从第i个字符开始的,由连续j个字符组成的子串SqString* SubStr(SqString* &s,int i,int j){    int k=0;    SqString *q;    InitString(q);    if(i<=0||i>s->length||j<0||i+j-1>s->length)        return q;    for(k=i-1; k<i+j-1; k++)    {        q->data[k-i+1]=s->data[k];    }    q->length=j;    q->data[j]='\0';    return q;}//将串t插入到串s中第i个位置,并返回新的串SqString* InsStr(SqString* &s,int i,SqString* &t){    int j=0;    SqString *q;    InitString(q);    if(i<=0||i>s->length+1)        return q;    for(j=0; j<i-1; j++)    {        q->data[j]=s->data[j];    }    for(j=0; j<t->length; j++)    {        q->data[i+j-1]=t->data[j];    }    for(j=i-1; j<s->length; j++)    {        q->data[t->length+j]=s->data[j];    }    q->length=s->length+t->length;    q->data[q->length]='\0';    return q;}//从串s中删去第i个字符开始的长度为j的子串,并返回产生的新串SqString* DelStr(SqString* &s,int i,int j){    int k;    SqString *q;    InitString(q);    if(i<=0||i>s->length||i+j>s->length+1)        return q;    for(k=0; k<i-1; k++)    {        q->data[k]=s->data[k];    }    for(k=i+j-1; k<s->length; k++)    {        q->data[k-j]=s->data[k];    }    q->length=s->length-j;    q->data[q->length]='\0';    return q;}//在串s中,将第i个字符开始的j个字符构成的子串用串t替换,并返回产生的新串SqString* RepStr(SqString* &s,int i,int j,SqString* &t){    int k;    SqString *q;    InitString(q);    if(i<=0||i>s->length||i+j-1>s->length)        return q;    for(k=0; k<i-1; k++)    {        q->data[k]=s->data[k];    }    for(k=0; k<t->length; k++)    {        q->data[i+k-1]=t->data[k];    }    for(k=i+j-1; k<s->length; k++)    {        q->data[t->length+k-j]=s->data[k];    }    q->length=s->length-j+t->length;    q->data[q->length]='\0';    return q;}//输出串void PrintStr(SqString* &s){    int i=0;    while(s->data[i]!='\0')    {        printf("%c",s->data[i]);        i++;    }    printf("\n");    printf("%d\n",s->length);}void GetNextval(SqString* &s,int nextval[]){    int j=0,k=-1;    nextval[0]=-1;    while(j<s->length)    {        if(k==-1||s->data[j]==s->data[k])        {            j++;            k++;            if(s->data[j]!=s->data[k])                nextval[j]=k;            else                nextval[j]=nextval[k];        }        else            k=nextval[k];    }}int KMPIndex(SqString* &s,SqString* &t){    int i=0,j=0;    int nextval[MaxSize];    GetNextval(t,nextval);    while(i<s->length&&j<t->length)    {        if(j==-1||s->data[i]==t->data[j])        {            i++;            j++;        }        else        {            j=nextval[j];        }    }    if(j>=t->length)        return (i-t->length);    else        return -1;}int main(){    int v;    char a[20]= {"I Love China"};    char b[20]= {"China"};    SqString *p;    SqString *q;   // SqString *m,*n;    InitString(p);    InitString(q);    StrAssign(p,a);    StrAssign(q,b);    //m=InsStr(p,5,q);    //n=DelStr(m,5,4);    //PrintStr(n);    v=KMPIndex(p,q);    printf("%d\n",v);    return 0;}
0 0