串操作——定长顺序存储,堆分配存储,模式匹配(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
- 串操作——定长顺序存储,堆分配存储,模式匹配(KMP)
- 串的表示和实现(串的堆分配存储、串的定长顺序存储结构)
- 串的定长顺序存储
- 串采用定长顺序存储结构的基本操作
- 串采用定长顺序存储结构的基本操作
- 串的定长顺序存储结构
- 串的定长顺序存储表示
- 数据结构--串--定长顺序存储表示
- 串的定长顺序存储表示
- 串的定长顺序存储结构
- 数据结构 串的定长顺序存储
- 堆分配存储串
- 动态存储分配(堆分配)的顺序串与顺序表在操作上的异同
- C语言数据结构——串的定长顺序存储结构
- C语言数据结构——串的定长顺序存储结构
- 串的定长顺序存储结构:实现串的基本操作Replace(&S,T,V)
- c语言版数据结构(奇迹冬瓜)-串(定长顺序存储各项操作)
- 数据结构编程笔记十一:第四章 串 定长顺序串以及模式匹配算法(BF和KMP)的实现
- sdnu1096一问一答
- Python双版本的pip冲突问题怎么解决
- Ubuntu下MySQL输入中文报错
- Android 简易刮刮卡实现
- 采集网页
- 串操作——定长顺序存储,堆分配存储,模式匹配(KMP)
- 线程控制(一)
- #详细#eclipse中文api(把注解设置成中文)的设置详解
- MySQL 用通配符过滤
- 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)
- python opencv:AttributeError: 'module' object has no attribute 'cv' FOURCC
- netfilter/iptables全攻略
- 阿里云双11活动撸福利攻略云服务器篇 必买爆款,包年低至240元
- 将vim打造成IDE(二)