串的存储结构

串其实是一种特殊的线性表,用什么样的存储结构实现线性表就可以类似的用什么样的方法实现串

一、串的顺序存储

1.静态数组(定长顺序存储):

//定义一个静态数组实现

#define MAXLEN 255        //预定义最大串长为255
typedef struct{
    char ch [MAXLEN];         //每个分量存储一个字符
    int length;               //串的实际长度
}SString;


分配连续的存储空间,每个char字符占1B                          length为串的实际长度

该方法的缺点就是长度固定不可变

 2.动态数组(对分配存储):

typedef struct{
    char *ch;           //按串长分配存储区,ch指向串的基地址
    int length;        //串的长度
}HString;

 


HString S;
s.ch = ( char *) malloc(MAXLEN* sizeof( char) ) ;      //用完需要手动free
s.length = 0;


 二、串的链式存储

typedef struct StringNode{
    char ch;             //每个结点存1个字符
    struct StringNode * next;
}StringNode,* String;

 存储密度低:每个字符1B,每个指针4B 。

typedef struct StringNode{
    char ch[4];               //每个结点存多个字符
    struct StringNode * next;
}StringNode,* String;

存储密度提高。

 

三、基本操作的实现:

StrAssign(&T,chars):赋值操作。把串T赋值为chars。

StrCopy(&T,S):复制操作。由串s复制得到串T。
StrEmpty(S):判空操作。若s为空串,则返回TRUE,否则返回FALSE。

StrLength(S):求串长。返回串s的元素个数。
ClearString(&S):清空操作。将s清为空串。

DestroyString(&S):销毁串。将串s销毁(回收存储空间)。
Concat(&T,S1,S2):串联接。用T返回由S1和S21联接而成的新串


 

1. SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
 

//定义一个静态数组实现

#define MAXLEN 255        //预定义最大串长为255
typedef struct{
    char ch [MAXLEN];         //每个分量存储一个字符
    int length;               //串的实际长度
}SString;



//求子串
bool SubString(sString &Sub,sString s, int pos,int len){
     //子串范围越界
     if (pos+len-1 > s.length)
         return false;
     for (int i=pos; i<pos+len; i++)
        Sub.ch[i-pos+1] = s.ch[i];
     Sub.length = len;
     return true;
}

2. StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=O;若S<T,则返回值<0。


 

//比较操作。若S>T,则返回值>0;若S=T,则返回植=若S<T,则返回值<0
int StrCompare( sString s, sstring T) {
    for (int i=1; i<=s.length && i<=T.length; i++){
       if (s.ch[i] !=T.ch[i] )
          return s.ch[i]-T.ch[i];
}
    //扫描过的所有字符都相同,则长度长的串更大
   return s.length-T.length;
}

3.Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现位置;否则函数值为0。

int Index( sString s,sstring T){
    int i=1,n=StrLength(S), m=StrLength(T);
    SString sub;              //用于暂存子串
    while(i<=n-m+1){
       SubString( sub,s,i,m) ;
       if(StrCompare(sub,T)!=0)    ++i;
       else return i;        //返回子串在主串中的位置
    }
    return 0;                //S中不存在与T相等的子串
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值