4.2 串的存储结构

36 篇文章 0 订阅
36 篇文章 0 订阅

一、顺序存储

//静态数组实现(定长顺序存储)
#define MAXLEN 255		//预定义最大串长为255
typedef struct{
    char ch[MAXLEN];	//每个分量存储一个字符
    int length;         //串的实际长度
}SString;
//分配连续的存储空间,每个char字符占1B


//动态数组实现(堆分配存储)
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个字符	1B
    struct StringNode * next;		//  4B
}StringNode,* String;
//这种方法存储密度低,每个字符1B,每个指针4B

//存储密度提高:
typedef struct StringNode{
    char ch[4];	//每个结点存放多个字符
    struct StringNode * next;
}StringNode,* String;

三、基于顺序存储实现基本操作

1.StrAssign(&T,chars):赋值操作。把串T赋值为chars
2.StrCopy(&T,S):复制操作。由串S复制得到串T
3.StrEmpty(S):判空操作。若S为空串,则返回true,否则返回false
4.StrLength(S):求串长。返回串S的元素个数
5.ClearString(&S):清空操作。将S清为空串
6.DestoryString(&S):销毁串。将串S销毁(回收存储空间)
7.Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串
//求子串,用Sub返回串S的第pos个字符起长度为len的子串
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;
}
//比较操作。若S>T,则返回值>0,若S<T,则返回值<0,若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;
}
//定位操作。若主串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中不存在与Tx
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值