串的定长存储用定长数组表述如下:
#define MaxStrlen 255 //预定串的最大长度为255
typedef unsigned char SString[MaxStrlen+1] //0号单元存放串的长度
串的实际长度可以预定长度范围内任意,超过预定长度的部分则被舍去,称
之为 截断 。
定长串常用基本操作的算法描述
插入串
int StrInsert(SString &S, int pos, SString T)
{
int i;
if (pos<=0 || pos>S[0]+1)
return ERROR; //插入位置不合法
if (S[0] + T[0] <= MaxStrlen)
{
for (i=S[0]; i>=pos; i--)
S[T[0]+i] = S[i]; //将串S中的最后pos个元素后移T[0]个位置
for (i=1; i<=T[0]; i++)
S[pos-1+i] = T[i];
S[0] = S[0] + T[0];
}
else
{//插入后串长 > MaxStrlen,串T的部分字符序列要舍去
for (i=S[0]; i>=pos; i--)
S[MaxStrlen-S[0]+i] = S[i]; /*将实际串S的最后pos个元素后移至
预定S串的最后pos个位置*/
for (i=1; i<=MaxStrlen-S[0]; i++)//只能插入MaxStrlen-S[0]个元素
S[pos-1+i] = T[i];
S[0] = MaxStrlen;
}
return OK;
}
串比较
int StrCompare(SString S, SString T)
{//返回值为0 、1 或 -1
int i;
for (i=0; i<S[0]&&i<T[0]; i++)
if (S[i] != T[i])
return (S[i] - T[i]);
return (S[0] - T[0]);
}
串连接
int Concat(SStrlen &T, SStrlen S1, SStrlen S2)
{
int i, uncut;
for (i=1; i<=S1[0]; i++)
T[i] = S1[i];
if (S1[0] + S2[0])
{//连接后串长小于MaxStrlen,未截断
for (i=S1[0]+1; i<S2[0]+S2[0]; i++)
T[i] = S2[i-S1[0]];
T[0] = S1[0] + S2[0];
uncut =TRUE;
}
else if (S1<MaxStrlen)
{//S1[0]<MaxStrlen 但是S1[0]+S2[0]>MaxStrlen,S2被截断
T[0] = MaxStrlen;
uncut = FALSE;
}
else
{//串S1的长度等于MaxStrlen,串S2不被连接
T[0] = S1[0];
uncut = FALSE;
}
}
求子串
int SubString(SString &sub, SString S, int pos, int len)
{
int i;
if (pos<=0 || pos>S[0] || len<0 ||len>S[0]-pos +1)
return ERROR;
if (len == 0)
sub[0] = 0;
else
{
sub[0] = len;
for (i=1; i<=len; i++)
sub[i] = S[pos+i-1];
}
return OK;
}
删除子串
int StrDelete(SString &S, int pos, int len)
{
int i;
if (pos<0 || pos>S[0]-len+1)
return ERROR;
for (i=pos+len; i<S[0]; i++)
S[i-len] = S[i];
S[0] = S[0] - len;
return OK;
}
串定位
int Indes(SString S, SString T, int pos)
{//若主串S的第pos字符之后存在与串T相等的子串,返回T在S中的位置
int i;
SString sub;
if (pos > 0)
{
i = pos;
while (i <= S[0]-T[0]+1)
{
SubString(sub, S, i, T[0]);
if (StringCompare(sub, T) != 0)
i++;
else
return i;
}
}
return 0;
}
//将字符串str插入到串S中
#include <stdio.h>
#define MaxStrlen 20
typedef unsigned char SString[MaxStrlen + 1];
int StrInsert(SString &S, int pos, SString T)
{
int i;
if (S[0]+T[0] <= MaxStrlen)
{
for (i=S[0]; i>=pos; i--)
S[T[0]+i] = S[i];
for (i=1; i<=T[0]; i++)
S[pos+i-1] = T[i];
S[0] = S[0] + T[0];
}
else
{
for (i=S[0]; i>=pos; i--)
S[MaxStrlen-S[0]+i] = S[i];
for (i=1; i<MaxStrlen-S[0]; i++)
S[pos-1+i] = T[i];
S[0] = MaxStrlen;
}
return 0;
}
int main(void)
{
int i;
SString S = " 123456789",
T = " hello";
S[0] = 9;
T[0] = 5;
StrInsert(S, 8, T);
for (i=1; i<=S[0]; i++)
printf("%c", S[i]);
printf("\n");
return 0;
}