#include
#include
#define MaxSize 50
typedef struct{
char data[MaxSize];
int length;
}SqString;
//生成串
void StrAssign(SqString &s,char cstr[]){
int i;
for(i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
//销毁串
void DestroyStr(SqString &s){
}
//串的复制
void StrCopy(SqString &s,SqString t){
int i;
for(i=0;i<t.length;i++)
s.data[i]=t.data[i];
s.length=t.length;
}
//判断串相等
bool StrEqual(SqString s,SqString t){
bool same=true;
int i;
if(s.length!=t.length) same=false;
else{
for(i=0;i<s.length;i++)
if(s.data!=t.data){
same=false;
break;
}
}
return same;
}
//求串的长
int StrLength(SqString s){
return s.length;
}
//串的连接
SqString Concat(SqString s,SqString t){
SqString str;
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
str.data[i]=s.data[i];
for(i=0;i<t.length;i++)
str.data[i+s.length]=t.data[i];
return str;
}
//求子串
SqString SubStr(SqString s,int i,int j){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||j<0||i+j-1>s.length)
return str;
for(k=i-1;k<i+j-1;k++)
str.data[k-i+1]=s.data[k];
str.length=j;
return str;
}
//子串的插入
SqString InsStr(SqString s1,int i,SqString s2){
int j;
SqString str;
str.length=0;
if(i<=0||i>s1.length+1)return str;
for(j=0;j<i-1;j++) str.data[j]=s1.data[j];
for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j];
for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
return str;
}
//子串的删除
SqString DelStr(SqString s,int i,int j){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j-1>s.length)return str;
for(k=0;k<i-1;k++) str.data[k]=s.data[k];
for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
//子串的替换
SqString InsStr(SqString s,int i,int j,SqString t){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j-1>s.length)return str;
for(k=0;k<i-1;k++) str.data[k]=s.data[k];
for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k];
for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
//输出串
void DispStr(SqString s){
int i;
if(s.length>0){
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
int main(){
SqString s,s1;
//建立串s,s1
printf("1、建立串s,s1\n");
char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
char cstr1[]={'x','y','z'};
StrAssign(s,cstr);
StrAssign(s1,cstr1);
printf("\n");
//输出串s
printf("2、输出串s:");
DispStr(s);
printf("\n");
//输出串s的长度
printf("3、输出串s的长度:");
StrLength(s);
printf("%d",StrLength(s));
printf("\n");
//在串s的第9个字符位置插入s1而产生s2
printf("4、在串s的第9个字符位置插入s1而产生s2");
SqString s2;
s2=InsStr(s,9,s1);
//输出s2
printf("5、输出串s2:");
DispStr(s2);
printf("\n");
//删除串s的第2个字符开始的5个字符而产生的s2
printf("6、删除串s的第2个字符开始的5个字符而产生的s2");
s2=DelStr(s,2,5);
printf("\n");
//输出s2
printf("7、输出串s2:");
DispStr(s2);
printf("\n");
//将串s的第二个字符开始的5个字符替换成s1而产生s2
printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2");
s2=InsStr(s,2,5,s1);
printf("\n");
//输出s2
printf("9、输出串s2:");
DispStr(s2);
printf("\n");
//提取串s的第2个字符开始的10个字符而产生串s3
printf("10、提取串s的第2个字符开始的10个字符而产生串s3");
SqString s3;
s3=SubStr(s,2,10);
printf("\n");
//输出串s3
printf("11、输出串s3:");
DispStr(s3);
printf("\n");
//将串s1与s2连接起来产生串s4
printf("12、将串s1与s2连接起来产生串s4");
SqString s4;
s4=Concat(s1,s2);
printf("\n");
//输出串s4
printf("13、输出串s4:");
DispStr(s4);
printf("\n");
return 0;
}
结果:

#include
#include
typedef struct snode{
char data;
struct snode *next;
}LinkStrNode;
//生成串
void StrAssign(LinkStrNode *&s,char cstr[]){
int i;
LinkStrNode *r,*p;
s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=s;
for(i=0;cstr[i]!='\0';i++){
p=(LinkStrNode *)malloc(sizeof(LinkStrNode));
p->data=cstr[i];
r->next=p;
r=p;
}
r->next=NULL;
}
//销毁串
void DestroyStr(LinkStrNode *&s){
LinkStrNode *pre=s,*p=s->next;
while(p!=NULL){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
//串的复制
void StrCopy(LinkStrNode *&s,LinkStrNode *t){
LinkStrNode *p=t->next,*q,*r;
s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=s;
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
}
//判断串相等
bool StrEqual(LinkStrNode *s,LinkStrNode *t){
LinkStrNode *p=s->next,*q=t->next;
while(p!=NULL&&q!=NULL&&p->data==q->data){
p=p->next;
q=q->next;
}
if(p==NULL&&q==NULL) return true;
else return false;
}
//求串的长
int StrLength(LinkStrNode *s){
LinkStrNode *p=s->next;
int count=0;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
//串的连接
LinkStrNode* Concat(LinkStrNode *s,LinkStrNode *t){
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=str;
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
p=t->next;
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
//求子串
LinkStrNode * SubStr(LinkStrNode *s,int i,int j){
int k;
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
return str;
for(k=1;k<i;k++)
p=p->next;
for(k=1;k<=j;k++)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
//子串的插入
LinkStrNode * InsStr(LinkStrNode *s,int i,LinkStrNode *t){
int k;
LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)+1)
return str;
for(k=1;k<i;k++){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
while(p1!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;r=q;
p1=p1->next;
}
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
//子串的删除
LinkStrNode * DelStr(LinkStrNode *s,int i,int j){
int k;
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
return str;
for(k=1;k<i;k++){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
for(k=0;k<j;k++) p=p->next;
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
//子串的替换
LinkStrNode * InsStr(LinkStrNode *s,int i,int j,LinkStrNode *t){
int k;
LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
return str;
for(k=0;k<i-1;k++){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
for(k=0;k<j;k++) p=p->next;
while(p1!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;r=q;
p1=p1->next;
}
while(p!=NULL){
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
//输出串
void DispStr(LinkStrNode *s){
LinkStrNode *p=s->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkStrNode *s,*s1;
//建立串s,s1
printf("1、建立串s,s1\n");
char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
char cstr1[]={'x','y','z'};
StrAssign(s,cstr);
StrAssign(s1,cstr1);
printf("\n");
//输出串s
printf("2、输出串s:");
DispStr(s);
printf("\n");
//输出串s的长度
printf("3、输出串s的长度:");
StrLength(s);
printf("%d",StrLength(s));
printf("\n");
//在串s的第9个字符位置插入s1而产生s2
printf("4、在串s的第9个字符位置插入s1而产生s2");
LinkStrNode *s2;
s2=InsStr(s,9,s1);
//输出s2
printf("5、输出串s2:");
DispStr(s2);
printf("\n");
//删除串s的第2个字符开始的5个字符而产生的s2
printf("6、删除串s的第2个字符开始的5个字符而产生的s2");
s2=DelStr(s,2,5);
printf("\n");
//输出s2
printf("7、输出串s2:");
DispStr(s2);
printf("\n");
//将串s的第二个字符开始的5个字符替换成s1而产生s2
printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2");
s2=InsStr(s,2,5,s1);
printf("\n");
//输出s2
printf("9、输出串s2:");
DispStr(s2);
printf("\n");
//提取串s的第2个字符开始的10个字符而产生串s3
printf("10、提取串s的第2个字符开始的10个字符而产生串s3");
LinkStrNode *s3;
s3=SubStr(s,2,10);
printf("\n");
//输出串s3
printf("11、输出串s3:");
DispStr(s3);
printf("\n");
//将串s1与s2连接起来产生串s4
printf("12、将串s1与s2连接起来产生串s4");
LinkStrNode *s4;
s4=Concat(s1,s2);
printf("\n");
//输出串s4
printf("13、输出串s4:");
DispStr(s4);
printf("\n");
return 0;
}
截图:

#include
#include
#define MaxSize 50
typedef struct{
char data[MaxSize];
int length;
}SqString;
//生成串
void StrAssign(SqString &s,char cstr[]){
int i;
for(i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
//销毁串
void DestroyStr(SqString &s){
}
//串的复制
void StrCopy(SqString &s,SqString t){
int i;
for(i=0;i<t.length;i++)
s.data[i]=t.data[i];
s.length=t.length;
}
//判断串相等
bool StrEqual(SqString s,SqString t){
bool same=true;
int i;
if(s.length!=t.length) same=false;
else{
for(i=0;i<s.length;i++)
if(s.data!=t.data){
same=false;
break;
}
}
return same;
}
//求串的长
int StrLength(SqString s){
return s.length;
}
//串的连接
SqString Concat(SqString s,SqString t){
SqString str;
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
str.data[i]=s.data[i];
for(i=0;i<t.length;i++)
str.data[i+s.length]=t.data[i];
return str;
}
//求子串
SqString SubStr(SqString s,int i,int j){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||j<0||i+j-1>s.length)
return str;
for(k=i-1;k<i+j-1;k++)
str.data[k-i+1]=s.data[k];
str.length=j;
return str;
}
//子串的插入
SqString InsStr(SqString s1,int i,SqString s2){
int j;
SqString str;
str.length=0;
if(i<=0||i>s1.length+1)return str;
for(j=0;j<i-1;j++) str.data[j]=s1.data[j];
for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j];
for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
return str;
}
//子串的删除
SqString DelStr(SqString s,int i,int j){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j-1>s.length)return str;
for(k=0;k<i-1;k++) str.data[k]=s.data[k];
for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
//子串的替换
SqString InsStr(SqString s,int i,int j,SqString t){
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j-1>s.length)return str;
for(k=0;k<i-1;k++) str.data[k]=s.data[k];
for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k];
for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
//输出串
void DispStr(SqString s){
int i;
if(s.length>0){
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
//BF算法
int BF(SqString s,SqString t){
int j=0,i=0;
while(i<s.length && j<t.length){
if(s.data[i]==t.data[j]){
i++;j++;
}else{
i=i-j+1;j=0;
}
}
if(j>=t.length)
return(i-t.length);
else return -1;
}
//KMP算法
//求串t的next数组
void GetNext(SqString t,int next[]){
int j,k;
j=0;k=-1;
next[0]=-1;
while(j<t.length-1){
if(k==-1 || t.data[j]==t.data[k]){
j++;k++;
next[j]=k;
}
else k=next[k];
}
}
//KMP
int KMPIndex(SqString s,SqString t){
int next[MaxSize],i=0,j=0;
GetNext(t,next);
while(i<s.length && j<t.length){
if(j==-1||s.data[i]==t.data[j]){
i++;j++;
}
else j=next[j];
}
if(j>=t.length) return(i-t.length);
else return -1;
}
//Nextval
void GetNextval(SqString t,int nextval[]){
int j,k;
j=0;k=-1;
nextval[0]=-1;
while(j<t.length){
if(k==-1 || t.data[j]==t.data[k]){
j++;k++;
if(t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else k=nextval[k];
}
}
//KMP
int KMPIndex1(SqString s,SqString t){
int nextval[MaxSize],i=0,j=0;
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(){
SqString s,t;
//建立串s,t
printf("1、建立串s,t\n");
char cstr[]={'a','b','c','a','b','c','d','a','b','c','d','e','a','b','c','d','e','f','a','b','c','d','e','f','g'};
char cstr1[]={'a','b','c','d','e','a','b','c','d','e','f','a','b'};
StrAssign(s,cstr);
StrAssign(t,cstr1);
printf("\n");
//输出串s
printf("2、输出串s:");
DispStr(s);
printf("\n");
//输出串t
printf("3、输出串t:");
DispStr(t);
printf("\n");
//t的next数组
printf("t的next数组:");
int next[t.length];
GetNext(t,next);
for(int i=0;i<t.length;i++)
printf("%d\t",next[i]);
printf("\n");
//t的nextval数组
printf("t的nextval数组:");
int nextval[t.length];
GetNextval(t,nextval);
for(int i=0;i<t.length;i++)
printf("%d\t",nextval[i]);
printf("\n");
//BF算法
KMPIndex(s,t);
printf("%d\n",KMPIndex(s,t));
KMPIndex1(s,t);
printf("%d\n",KMPIndex1(s,t));
return 0;
}
结果:
