数据结构――定长串操作(二)

2014-11-24 07:47:17 · 作者: · 浏览: 1
{
return 0;
}
else if(S[0]>T[0])
{
return 1;
}
else
{
return -1;
}
}
//-----返回串长-----
int StrLength(SString S)
{
return S[0];
}
//-----清空串-----
Bool ClearString(SString *S)
{
if(0 != (*S)[0])
{
(*S)[1] = '\0'; //首地址写入'\0'
(*S)[0] = 0; //串长写入0
}
return TURE;
}
//-----串连接,把串S2连接到S1后面并存放到串T当中-----
Bool Concat(SString *T,SString S1,SString S2)
{
int i,j;
//全部能复制完
if(S1[0]+S2[0] <= MAXSTRLEN)
{
for(i=1; i<=S1[0]; i++)
{
(*T)[i]=S1[i]; //复制串S1到串T中
}
for(j=1; i<=S1[0]+S2[0]; i++)
{
(*T)[i]=S2[j++]; //复制串S2到串T中
}
(*T)[0]=S1[0]+S2[0];
return TURE;
}
//此情况S1能全部复制完,而S2只能复制一部分,因为此函数优先复制S1
else if(S1[0]MAXSTRLEN)
{
for(i=1; i<=S1[0]; i++)
{
(*T)[i]=S1[i];
}
for(j=1;i<=MAXSTRLEN;i++)
{
(*T)[i]=S2[j++];
}
(*T)[0]=MAXSTRLEN;
return ERROR;
}
//只能复制S1一部分
else
{
for(i=1; i<=MAXSTRLEN; i++)
{
(*T)[i]=S1[i];
}
(*T)[0]=MAXSTRLEN;
return ERROR;
}
}
//-----打印指定串S-----
void StrOutput(SString S)
{
int i;
printf("Output string:");
for(i=1; i<=S[0]; i++)
{
printf("%c",S[i]);
}
printf("\n");
}
//-----截取指定字符串,用Sub返回串S中在pos位置开始长度为len的字串-----
Bool 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))
{
for(i=1,j=pos; i<=len; i++)
{
(*Sub)[i]=S[j++];
}
(*Sub)[0]=len;
return TURE;
}
return ERROR;
}
//-----在串S中从pos位置查找第一次出现串T的位置,返回相对S新的偏移位置-----
int Index(SString S, SString T, int pos)
{
int m,n,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(0!=StrCompare(sub,T))
{
++i;
}
else
{
return i;
}
}
}
return 0;
}
//-----把串S中所有字符串T用V替换掉-----
Bool Replace(SString *S, SString T, SString V)
{
int i=1,j=1,m=StrLength(T),n=StrLength(V);
while(i <= (*S)[0]) //遍历所有的字符
{
j=Index(*S,T,i); //查找匹配字串的位置
if(j > 0) //查找到字串
{
StrDelete(S,j,m); //删除字串
StrInsert(S,j,V); //插入替换字串
}
i+=n+1;
//i++;
printf("======%d======\n", i);
}
return TURE;
}
//-----在串S的第pos位置前插入串T, 插入时注意S空间要足够大-----
Bool StrInsert(SString *S, int pos, SString T)
{
int m,n=StrLength(T),i=1,j=pos;
if(pos>=1 && pos<=StrLength(*S)+1 && (T[0]+(*S)[0] <= MAXSTRLEN))
{
while(i<=n)
{
for(m=StrLength(*S)+1; j
{
(*S)[m]=(*S)[m-1]; //字串后移一位,挪出一位空间
}
(*S)[j]=T[i++]; //拷贝串T字符到串S中
(*S)[0]+=1; //S串长加1
j+=1; //插入位置后移一位
}
return TURE;
}
return ERROR;
}
//------删除串S中从pos位置起长度为len的子串------
Bool StrDelete(SString *S, int pos, int len)
{
int i=1,j,m,n;