串操作——定长顺序存储,堆分配存储,模式匹配(KMP)

一、串基本操作——定长顺序存储

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列,该结构,按预定义的大小,为每个定义的串变量分配一个固定长度的存储区

#include <stdio.h>
#include <malloc.h>
int getLength(char *str)
{
    int len=0;
    while(str[len]!='\0')
    {
        len++;
    }
    //len--;
    return len;
}

int strCompare(char *str1,char *str2)
{
    int i=0;
    if(str1==NULL||str2==NULL)
        exit(0);
    while(str1[i]==str2[i]&&str1!='\0'&&str2!='\0')
    {
        ++i;
    }
    return (int)(str1[i]-str2[i]);
}

void strConcat(char *str,char *str1,char *str2)
{
    int i;
    int m=0;
   // if(str!=NULL)
     //   str=NULL;
    for(i=0;i<getLength(str1);i++)
    {
        str[m++]=str1[i];
    }
    for(i=0;i<getLength(str2);i++)
    {
        str[m++]=str2[i];
        str[m]='\0';
    }

}
void SubString(char *str,char *str1,int pos,int len)
{
    int i;
   // if(pos<1||pos>getLength(&str1)||len=0||len>getLength(&str1)-pos+1)
       // printf("error");
    //str=NULL;
    //j=pos;
    for(i=0;i<len-1;i++,pos++)
    {
        str[i]=str1[pos];
    }
    str[i]='\0';
}
int main()
{
    int len;
    int compare;
    char str[200];
    char str3[200];
    char str1[]="hbabbass";
    char str2[]="adsdsaas";
    //get len
    len=getLength(str1);
    printf("%d",len);

    printf("\n");

    //compare str
    compare=strCompare(str1,str2);
    printf("%d",compare);

    printf("\n");

    //concat str
    strConcat(str,str1,str2);
    printf("%s",str);

    printf("\n");

    //substring
    SubString(str3,str1,2,3);
    printf("%s\n",str3);
    return 0;
}

二、串基本操作——堆分配存储结构

顺序存储,动态分配(长度不定)

#include <stdio.h>
#include <malloc.h>
typedef struct{
    char *ch;
    int length;
}HString;
void Init(HString *T)
{
    T->length=0;
    T->ch=NULL;
}
int StrAssign(HString *T,char *chars){
    int i,j;
    char *c;
    if(T->ch)
        free(T->ch);
    for(i=0,c=chars;c[i]!='\0';)
    {
        i++;
    }   //chars长度
    if(!i)
    {
        T->ch=NULL;
        T->length=0;
    }
    else
    {
        T->ch=(char *)malloc(i*sizeof(char));
        if(!(T->ch))
            exit(0);
        for(j=0;j<i;j++)
            T->ch[j]=chars[j];
        T->length=i;
    }
    return 1;
}

int Getlength(HString S)
{
    return S.length;
}

//若S>T则返回值大于0
int Compare(HString S,HString T)
{
    int i;
    for(i=0;i<S.length&&i<T.length;i++)
    {
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    return S.length-T.length;
}

void Concat(HString S,HString T,HString *M)
{
    int i,j=0;
   // j=T.length;
    if(M->ch)
        free(M->ch);
    //if(!(M->ch=(HString*)malloc(S.length+T.length)*sizeof(char)))
      //  exit(0);
    M->ch=(char *)malloc((S.length+T.length)*sizeof(char));
    for(i=0;i<S.length;i++)
    {
        M->ch[j++]=S.ch[i];
    }
    for(i=0;i<T.length;i++)
    {
        M->ch[j++]=T.ch[i];
        M->ch[j]='\0';
    }
}
void SubString(HString *str,HString *S,int pos,int len)
{
    int i;
  //  j=pos;
    if(str->ch)
        free(str->ch);
    if(!len)
    {
        str->ch=NULL;
        str->length=0;
    }
    else{
        str->ch=(char *)malloc(len*sizeof(char));
        for(i=0;i<len;i++,pos++)
        {
            str->ch[i]=S->ch[pos];
        }
    }
}
int main()
{
    int i;
    int len;
    HString S;
    HString T;
    HString M;
    char *c;
    char *a="sssSSA";
    char *r="asSASAS";
    Init(&S);
    Init(&T);
    Init(&M);
    StrAssign(&S,a);
    StrAssign(&T,r);
    i=Compare(S,T);
    printf("%d",i);

    printf("\n");

    len=Getlength(S);
    printf("%d",len);

    printf("\n");

    Concat(S,T,&M);
    printf("%s\n",M);

    SubString(&M,&S,1,3);
    printf("%s\n",M);
    return 0;
}

三、串模式匹配(KMP算法)

#include <stdio.h>
#include <string.h>
typedef struct{
    int length;
    char *str;
}SString;

void get_next(SString T,int *next)
{
    int i=1;
    int j=0;
    next[1]=0;
    while(i<T.length)
    {
        if(j==0||T.str[i]==T.str[j])
        {
            ++i;
            ++j;
            next[i]=j;
        }
        else{
            j=next[j];
        }
    }
}

int Index_kmp(SString S,SString T,int pos)
{
    int i=pos;
    int j=1;
    int count=0;
    int next[255];
    get_next(T,next);

    while(i<=S.length)
    {
        //i=pos;
        if(j==0||S.str[i]==T.str[j])
        {
            ++i;
            ++j;
        }
        else{
            j=next[j];
        }
        if(j==T.length+1)
        {
            count++;
            j=next[j-2];//为了让j能够回到第一个字母位,但不能直接j=1,因为会失去一次i++的机会(j=0的时候),这样会无法记录某些字符
          // j=1;
           i--;
        }
    }
    return count;
}

int main()
{
    SString S,T;
    int m;
    char *str1=" ababaaba";
    S.str=str1;
    S.length=strlen(str1)-1;
    char *str2=" aba";
   // S.length=strlen(str1)-1;
    //T.length=strlen(str2)-1;
    //S.str=str1;
    T.str=str2;
    T.length=strlen(str2)-1;
    m=Index_kmp(S,T,0);

    printf("%d",m);
    /*if(m==0){
        printf("error");
    }
    else{
        printf("success");
    }*/
    return 0;
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/w_linux/article/details/78366165
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞