定长串的基本操作

串的定长顺序存储表示 即用一组地址连续的存储单元存储串中的字符序列。
串的定长存储用定长数组表述如下:

#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;
}


 

转载于:https://www.cnblogs.com/zm001/archive/2012/12/01/2875486.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值