#include <iostream>
const int MAXSIZE=100 ;
using namespace std;
typedef struct{
char data[MAXSIZE];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[])
{
int i=0;
for(;cstr[i]!=0;i++)
{
s.data[i]=cstr[i];
}
s.length=i;
}
void DestroyStr(SqString &s)
{
}
void StrCopy(SqString &s,SqString t)
{
s.length=t.length;
for(int i=0;i<s.length;i++)
s.data[i]=t.data[i];
}
bool StrEqual(SqString s,SqString t)
{
if(s.length!=t.length)
return false;
else
{
for(int i=0;i<t.length;i++)
{
if(s.data[i]!=t.data[i])
{
return false;
break;
}
}
return true;
}
}
int StrLength(SqString s)
{
return s.length;
}
SqString Concat(SqString s,SqString t)
{
SqString s1;
int i=s.length;
int j=t.length;
for(int k=0;k<i+j;k++)
{
if(k<i)
s1.data[k]=s.data[k];
else
s1.data[k]=t.data[k-i];
}
s1.length=i+j;
return s1;
}
SqString SubStr(SqString s,int i,int j)
{
SqString s1;
if(i<0||j>s.length)
return s1;
int m=0;
for(int k=i-1;k<j;k++)
s1.data[m++]=s.data[k];
s1.length=j-i+1;
return s1;
}
SqString InsStr(SqString s1,int i,SqString s2)//a b (qwer)c d e f g qwer
{
SqString s;
int num=0;
if(i<0||i>s1.length)
return s;
else
{
s.length=s1.length+s2.length;
for(int k=0;k<s.length;k++)
{
if(k<i-1)
{
s.data[k]=s1.data[k];
//cout<<k<<endl;
}
else if(k>=i-1&&k<s2.length+i-1)
{
s.data[k]=s2.data[num++];
//cout<<k<<endl;
}
else if(k<s.length&&k>=s2.length+i-1)
{
s.data[k]=s1.data[k-s2.length];
//cout<<k<<endl;
}
}
}
return s;
}
SqString DelStr(SqString s,int i,int j)//q w e r t
{
SqString s1;
if(i<0||j>s.length)
return s1;
for(int k=0;k<s.length-(j-i);k++)
{
if(k<i-1)
s1.data[k]=s.data[k];
else
{
s1.data[k]=s.data[j++];
}
}
s1.length=s.length-(j-i);
return s1;
}
SqString RepStr(SqString s,int i,int j,SqString t)
{
int m=0;
SqString s1=s;
for(int k=i-1;k<j;k++)
{
s1.data[k]=t.data[m++];
}
return s1;
}
void DispStr(SqString s)
{
cout<<"串的值为:"<<endl;
for(int i=0;i<s.length;i++)
cout<<s.data[i]<<endl;
}
void GetNextval(SqString t,int nextval[])
{
int 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 KMP(SqString s,SqString t)
{
//主串为s,模式串为t
int nextval[100],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()
{
char ch[]={"abcdefghijk"};
char ah[]={"qwert"};
char aa[]={"abcaabbabcabaacbaacbacba"};
char bb[]={"abcabaa"};
SqString s;
SqString t;
SqString m;
SqString z;
SqString q;
SqString n;
SqString w;
SqString p;
StrAssign(s,ch);
cout<<"串的长度为:"<<endl;
cout<<StrLength(s)<<endl;
StrCopy(m,s);
cout<<"复制后的m为:"<<endl;
DispStr(m);
StrAssign(t,ah);
cout<<"赋值后的t为:"<<endl;
DispStr(t);
if(StrEqual(s,t))
cout<<"s串与t串相等噢"<<endl;
else
cout<<"s串与t串不相等噢"<<endl;
z=Concat(s,t);
cout<<"将s串与t串连接后的样子为:"<<endl;
DispStr(z);
q=SubStr(t,1,4);
cout<<"t串1~4长度上的子串为:"<<endl;
DispStr(q);
cout<<"将s删除2~10上的元素后为:"<<endl;
n=DelStr(s,2,10);
DispStr(n);
cout<<"将s的1~5位置用t串将其替换:"<<endl;
w=RepStr(s,1,5,t);
DispStr(w);
cout<<"在s的3号位置插入t串:"<<endl;
p=InsStr(s,3,t);
DispStr(p);
//以下为KMP算法匹配
StrAssign(s,aa);
StrAssign(t,bb);
DispStr(s);
DispStr(t);
if(KMP(s,t))
cout<<"模式串t在s第"<<KMP(s,t)<<"个位置匹配上"<<endl;
else
cout<<"匹配失败!"<<endl;
DestroyStr(s);
DestroyStr(t);
DestroyStr(m);
//...
return 0;
}