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

来源:互联网 发布:孙翊 知乎 编辑:程序博客网 时间:2024/05/16 15:35

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

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

#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则返回值大于0int 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;}
阅读全文
2 0