顺序串的基本操作
#include<bits/stdc++.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSTRLEN 255
typedef int Status;
typedef int ElemType;
typedef unsigned char SString[MAXSTRLEN + 1];
using namespace std;
Status StrAssign(SString T,char chars[])
{
int i;
if(strlen(chars)>MAXSTRLEN)
return ERROR;
T[0]=strlen(chars);
for(i=0; i<=T[0]; i++)
{
T[i+1]=chars[i];
}
return OK;
}
Status StrCopy(SString T,SString S)
{
int i;
for(i=1; i<=S[0]; i++)
{
T[i]=S[i];
}
T[0]=S[0];
return OK;
}
Status StrEmpty(SString S)
{
if(S[0]==0)
return TRUE;
else
return FALSE;
}
Status Strcompare(SString S,SString T)
{
int i;
for(i=1; i<=S[0]&&i<=T[0]; i++)
{
if(S[i]!=T[i])
return S[i]-T[i];
}
return S[0]-T[0];
}
Status StrLength(SString S)
{
return S[0];
}
Status Concat(SString T,SString S1,SString S2)
{
int i,j;
Status uncut;
if(S1[0]+S2[0]<=MAXSTRLEN)
{
T[0]=S1[0]+S2[0];
for(i=1; i<=S1[0]; i++)
{
T[i]=S1[i];
}
for(j=1; j<=S2[0]; j++)
{
T[S1[0]+j]=S2[j];
}
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN)
{
T[0]=MAXSTRLEN;
for(i=1; i<S1[0]; i++)
{
T[i]=S1[i];
}
for(j=1; j<=MAXSTRLEN-S1[0]; j++)
{
T[S1[0]+j]=S2[j];
}
uncut=FALSE;
}
else
{
T[0]=MAXSTRLEN;
for(i=1; i<=MAXSTRLEN; i++)
{
T[i]=S1[i];
}
uncut=FALSE;
}
return uncut;
}
Status SubString(SString Sub,SString S,int pos,int len)
{
int i,j;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
if(!len)
{
Sub=NULL;
Sub[0]=0;
}
else
{
for(i=1,j=pos; i<=len-1,j<=pos+len-1; i++,j++)
Sub[i]=S[j];
Sub[0]=len;
}
return OK;
}
Status Index(SString S,SString T,int pos)
{
int n, m,i;
SString Sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<=n-m+1)
{
SubString(Sub, S, i, m);
if (Strcompare(Sub, T) != 0)
++i;
else
return i;
}
}
return 0;
}
Status StrInsert(SString S,int pos,SString T)
{
int i;
if (pos<1 || pos>S[0])
return ERROR;
if (S[0] + T[0] < MAXSTRLEN)
{
for (i = S[0]; i >= pos; i--)
{
S[i + T[0]] = S[i];
}
for (i = 1; i <=T[0]; i++)
{
S[pos-1+i] = T[i];
}
S[0] = S[0] + T[0];
return TRUE;
}
else
{
for (i = S[0]; i >= MAXSTRLEN-S[0]; i--)
{
S[MAXSTRLEN-S[0]+1] = S[i];
}
for (i = 1; i <= MAXSTRLEN - S[0]; i++)
{
S[pos - 1 + i] = T[i];
}
return FALSE;
}
}
Status StrDelete(SString S,int pos,int len)
{
int i;
if (pos<1 || pos>S[0])
return ERROR;
else
for (i = pos + len ; i<=S[0]; i++)
{
S[i-len] = S[i];
}
S[0] -= len;
return OK;
}
Status StrPrint(SString S)
{
int i;
for (i = 1; i <= S[0]; i++)
{
cout << S[i];
}
cout << endl;
return 0;
}
int main()
{
int pos,len;
SString S1,S2,T1,T2,Sub;
char a[100], b[100],c[100];
cout << "请输入两个串,分别赋值给串s1和串s2" << endl;
cin >> a >> b;
StrAssign(S1, a);
StrAssign(S2, b);
cout << "把串S1拷贝给T1,输出T1:";
StrCopy(T1, S1);
StrPrint(T1);
cout<<endl;
if (StrEmpty(T1) == 1)
cout << "串T1为空!" << endl;
else
cout << "串T1非空!" << endl;
cout<<endl;
if (Strcompare(S1, S2) > 0)
cout << "S1>S2" << endl;
else if (Strcompare(S1, S2) < 0)
cout << "S1<S2" << endl;
else
cout << "S1=S2" << endl;
cout<<endl;
cout << "连接S1,S2为T2,输出T2:";
if (Concat(T2, S1, S2) == 1)
StrPrint(T2);
else
cout << "串连接失败" << endl;
cout<<endl;
cout << "串T2的长度为:";
cout <<StrLength(T2)<< endl;
cout<<endl;
cout << "请输入求T2子串的pos和len的值"<<endl;
cin >> pos>> len;
if (SubString(Sub, T2, pos, len) == 1)
{
cout << "所选区间的子串Sub为:";
StrPrint(Sub);
}
else
cout << "求子串失败!" << endl;
cout<<endl;
cout<<"请输入要查询的子串:";
cin>>c;
StrAssign(Sub,c);
cout<<"请输入要从哪个位置之后开始查询:";
cin>>pos;
if (Index(T2,Sub,pos))
{
cout<<"pos的值为:";
cout<<Index(T2,Sub,pos)<<endl;
}
else
cout << "查询失败" << endl;
cout<<endl;
cout << "在串S1的第pos位置插入串S2" << endl;
cout << "输入pos的值:";
cin >> pos;
if (StrInsert(S1, pos, S2) == 1)
{
cout << "输出串S1:";
StrPrint(S1);
}
else
cout << "插入失败" << endl;
cout<<endl;
cout << "从串S1中删除第pos位置起长度为len的字符" << endl;
cout << "输入pos,len的值:";
cin >> pos >> len;
if (StrDelete(S1, pos, len) == 1)
{
cout << "输出删除后的串S1:";
StrPrint(S1);
}
else
cout << "删除失败" << endl;
return 0;
}