线性表——串——定长顺序串

长度为n的串的子串数目为n(n+1)/2+1

长度为1的子串有n个,

长度为2的子串有n-1个,

长度为3的子串有n-2个,……,

长度为n的子串有1个,

+空串

5.1定长顺序串

超出预定长度,截断

5.1.1类型构造

#define MAXLEN 20
typedef struct {
  char ch[MAXLEN];
  int len;
} SString; 

5.1.2置空串

StrClear( SString *s )
{     
   s->len=0;
   return(1);
} 

5.1.3求串长

int StrLength(SString s)
{
    return(s.len);
} 

5.1.4判断是否为空串

StrEmpty(SString s)
{
    if (s.len==0) return(1);
    else return(0);
} 

5.1.5复制串

StrCopy(SString * s, SString t)
{
    for (i=0;i<=t.len-1;i++) 
       s->ch[i]=t.ch[i];
    s->len=t.len;
} 

5.1.6串比较

StrCompare(SString s, SString t){

   for(i=0;i<s.len&&i<t.len;i++)
      if(s.ch[i]!=t.ch[i]) 
         return(s.ch[i]-t.ch[i]);

   if(i==s.len&&s.len==t.len) return 0;//若串s和t相等,则返回0
   if(s.len>t.len) return s.ch[i];//若s>t返回正整数
   else return 0-t.ch[i];//若s<t返回负整数
} 

5.1.7串插入

//在串s第pos个字符前插入串t


int StrInsert(SString *S,int pos,SString T){
  if(pos<1||pos>s->len+1)  return 0;//首先判断插入位置是否合法

  if(s->len+t.len<=MAXLEN) {//两串都无截断情况
    //i表示下标
    for(i=s->len-1;i>=pos-1;i--)//从s串的最后一个字符往前到第pos个字符,依次后移动t.len个位置
      s->ch[i+t.len]=s->ch[i];

    for(i=0;i<=t.len-1;i++)//串t插入  
      s->ch[i+pos-1]=t.ch[i];

    s->len=s->len+t.len;//最后别忘了更新串长
  }


    else if(pos+t.len-1<=MAXLEN){//串t能全部插入,但串s得截断一部分

        for(i=MAXLEN-1; i>=pos-1+t.len;i--)  
          s->ch[i]=s->ch[i-t.len];

        for(i=0;i<=t.len-1;i++)  
          s->ch[i+pos-1]=t.ch[i];

        s->len=MAXLEN;
      }



    else{//串t都不能全部插入
       for(i=0;i<=MAXLEN-pos;i++)  
         s->ch[i+pos-1]=t.ch[i];

       s->len=MAXLEN;
     }


}

5.1.8删除子串

在串s中删除从第pos个字符起len个字符

首先判断删除是否合法:

因为1<=pos<=s->len 且 pos+len-1<=s->len
所以pos要满足:1<=pos<=s->len-len+1

StrDelete(SString * s,int pos,int len) {
  if(pos<1||pos>(s->len-len+1))  return(0);

  for(i=pos+len-1;i<=s->len-1;i++)

    s->ch[i-len]=s->ch[i];

  s->len=s->len-len;
  return(1);
}

5.1.9串连接

//分三种情况

StrCat(SString * s, SString t) 
{

    if(s->len+t.len<=MAXLEN){ //t能完全连接到s后面
  for(i=0;i<t.len;i++)  
    s->ch[i+s->len]=t.ch[i];
  s->len+=t.len;  
  flag=1;
}

    else if(s->len<MAXLEN) {//t只能连一部分到s后面
       for(i=0;i<MAXLEN-s->len;i++)  
         s->ch[i+s->len]=t.ch[i];
       s->len=MAXLEN; flag=0;
     } 

     else  flag=0;  //s已满
     return(flag);

}

5.1.10求子串

将串s中第pos个字符起,len个字符复制到串sub中

判断是否合法:

1 <= pos <= s.len
1 <=len 且 pos-1+len <= s.len

SubStr(SString *sub,SString s,int pos,int len){

  if(pos<1||pos>s.len||len<1||len>s.len-pos+1)
    {  sub->len=0;  return(0);  }

  else{
    for(i=0;i<len;i++) 
      sub->ch[i]=s.ch[i+pos-1];

    sub->len=len;  
    return(1);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值