顺序串的基本运算
顺序串的定义
#include <stdio.h>
#define MaxSize 100
typedef struct
{
char ch[MaxSize];
int len;
} SqString;
赋值运算
void Assign(SqString &s,char t[])
{
int i=0;
while (t[i]!='\0')
{
s.ch[i]=t[i];
i++;
}
s.len=i;
}
复制运算
void StrCopy(SqString &s,SqString t)
{
int i;
for (i=0;i<t.len;i++)
s.ch[i]=t.ch[i];
s.len=t.len;
}
求串长运算
int StrLength(SqString s)
{
return(s.len);
}
判断串相等运算
int StrEqual(SqString s,SqString t)
{
int i=0;
if (s.len!=t.len)
return(0);
else
{
for (i=0;i<s.len;i++)
if (s.ch[i]!=t.ch[i])
return(0);
return(1);
}
}
串连接运算
SqString Concat(SqString s,SqString t)
{
SqString r;
int i,j;
for (i=0;i<s.len;i++)
r.ch[i]=s.ch[i];
for (j=0;j<t.len;j++)
r.ch[s.len+j]=t.ch[j];
r.len=i+j;
return(r);
}
求子串运算
SqString SubStr(SqString s,int i,int j)
{
SqString t;
int k;
if (i<1 || i>s.len || j<1 || i+j>s.len+1)
t.len=0;
else
{
for (k=i-1;k<i+j;k++)
t.ch[k-i+1]=s.ch[k];
t.len=j;
}
return(t);
}
查找子串位置运算
int Index(SqString s,SqString t)
{
int i=0,j=0,k;
while (i<s.len && j<t.len)
{
if (s.ch[i]==t.ch[j])
{
i++;j++;
}
else
{
i=i-j+1;j=0;
}
}
if (j>=t.len)
k=i-t.len+1;
else
k=-1;
return(k);
}
子串插入运算
int InsStr(SqString &s,int i,SqString t)
{
int j;
if (i>s.len+1)
return(0);
else
{
for (j=s.len;j>=i-1;j--)
s.ch[j+t.len]=s.ch[j];
for (j=0;j<t.len;j++)
s.ch[i+j-1]=t.ch[j];
s.len=s.len+t.len;
return(1);
}
}
子串删除运算
int DelStr(SqString &s,int i,int j)
{
int k;
if (i<1 || i>s.len || j<1 || i+j>s.len+1)
return(0);
else
{
for (k=i+j-1;k<s.len;k++)
s.ch[k-j]=s.ch[k];
s.len=s.len-j;
return(1);
}
}
子串替换运算
SqString RepStrAll(SqString s,SqString s1,SqString s2)
{
int i;
i=Index(s,s1);
while (i>=0)
{
DelStr(s,i,s1.len);
InsStr(s,i,s2);
i=Index(s,s1);
}
return(s);
}
输出串运算
void DispStr(SqString s)
{
int i;
for (i=0;i<s.len;i++)
printf("%c",s.ch[i]);
printf("\n");
}
main
void main()
{
SqString s1,s2,s3,s4,s5,s6,s7;
Assign(s1,"abcd");
printf("s1:");DispStr(s1);
printf("s1的长度:%d\n",StrLength(s1));
printf("s1=>s2\n");
StrCopy(s2,s1);
printf("s2:");DispStr(s2);
printf("s1和s2%s\n",(StrEqual(s1,s2)==1?"相同":"不相同"));
Assign(s3,"12345678");
printf("s3:");DispStr(s3);
printf("s1和s3连接=>s4\n");
s4=Concat(s1,s3);
printf("s4:");DispStr(s4);
printf("s3[2..5]=>s5\n");
s5=SubStr(s3,2,4);
printf("s5:");DispStr(s5);
Assign(s6,"567");
printf("s6:");DispStr(s6);
printf("s6在s3中位置:%d\n",Index(s3,s6));
printf("从s3中删除s3[3..6]字符\n");
DelStr(s3,3,4);
printf("s3:");DispStr(s3);
printf("从s4中将s6替换成s1=>s7\n");
s7=RepStrAll(s4,s6,s1);
printf("s7:");DispStr(s7);
}