2020-9-22 //严蔚敏《数据结构》 //串的 定长顺序存储

本文深入探讨了严蔚敏《数据结构》中关于串的定长顺序存储结构,详细解析了其原理、操作方法及应用场景。
摘要由CSDN通过智能技术生成
//严蔚敏《数据结构》
//串的 定长顺序存储  个人感觉实际应用中用的很少,缺点太大了,空间定死了,而且在运行期间空间不能扩大
//自学中,加油
#include<iostream>
using namespace std;
const int MaxStrLen=5;

typedef char SString[MaxStrLen+1];//SString类型的在声明变量的时候  变量其实已经初始化了

void Output_Str(SString S)
{
    cout<<"串:\n";
    for(int i=1;i<=S[0];i++)
        cout<<S[i];
    cout<<endl<<"----\n";
}

bool Assign_Str(SString& S,char ch[],int m)//复制ch字符数组到串S中,复制成功,返回true,否则返回false
{
    if(m>MaxStrLen){
        cout<<"长度超过,被截断\n";
        for(int i=1;i<=MaxStrLen+1;i++){
            S[i]=ch[i-1];
        }
        S[0]=MaxStrLen;
    }
    else{
        for(int i=1;i<=m;i++){
            S[i]=ch[i-1];
        }
        S[0]=m;
    }
    return true;
}

bool Copy_Str(SString& T,SString S)//复制串S到串T中,复制成功,返回true,否则返回false
{
    //因为T、S都是SString类型的,有相同的最大空间,S的长度不会超过MaxSTrLen
    for(int i=0;i<=S[0];i++){
        T[i]=S[i];
    }
    return true;
}

bool IsEmpty_Str(SString S)//若串S为空,返回true,否则返回false
{
    if(!S[0])
        return true;
    return false;
}

int Compare_Str(SString S,SString T)//返回值>0:S>T;返回值==0:S==T;返回值<0:S<T
{
    int i=1;
    while(i<=S[0]&&i<=T[0]&&S[i]==T[i]){//找到第一个串S、串T的不同后停止循环
        i++;
    }
    if(i<=S[0]&&i>T[0])
        return 1;
    if(i>S[0]&&i<=T[0])
        return -1;
    if(i>S[0]&&i>T[0])
        return 0;
    if(S[i]!=T[i]){
        if(S[i]<T[i])
            return -1;
        else
            return 1;
    }
}

int Length_Str(SString S)//返回串s的长度
{
    return S[0];
}

bool Clear_Str(SString& S)//清空串S,成功清空返回true
{
    S[0]=0;
    return true;
}

bool Concat_Str(SString& T,SString S1,SString S2)//T=S1+S2;若长度超过T[0],则超过的部分被截断
{
    if(S1[0]+S2[0]<=MaxStrLen){
        for(int i=1;i<=S1[0];i++){
            T[i]=S1[i];
        }
        for(int i=S1[0]+1;i<=S1[0]+S2[0];i++){
            T[i]=S2[i-S1[0]];
        }
        T[0]=S1[0]+S2[0];
    }
    else if(S1[0]<=MaxStrLen){
        for(int i=1;i<=S1[0];i++){
            T[i]=S1[i];
        }
        for(int j=S1[0]+1;j<=MaxStrLen;j++){
            T[j]=S2[j-S1[0]];
        }
        T[0]=MaxStrLen;
    }
    else{
        for(int i=1;i<=MaxStrLen;i++){
            T[i]=S1[i];
        }
        T[0]=MaxStrLen;
    }
    return true;
}

bool Sub_Str(SString& Sub,SString S,int pos,int len)//Sub[1...len]=S[pos...pos+len-1]
//1<=pos<=S[0]; 0<=len<=S[0]-pos+1
{
    if(pos<1||pos>S[0]){
        cout<<"pos值 不合理\n";
        return false;
    }
    if(len<0||len>S[0]-pos+1){
        cout<<"len值 不合理\n";
        return false;
    }
    for(int i=1;i<=len;i++){
        Sub[i]=S[pos+i-1];
    }
    Sub[0]=len;
    return true;
}

int Index_Str(SString S,SString T,int pos)//检索主串S中从pos位置后是否有串T,若有,返回第一次的位置,若无,返回0
{//1<=pos<=S[0]
    if(pos<1||pos>S[0]){
        cout<<"pos值不合理\n";
        return -1;
    }
    int lenS=S[0],lenT=T[0];
    SString Sub;
    for(int i=pos;i<=S[0];i++){
        Sub_Str(Sub,S,i,T[0]);
        if(Compare_Str(Sub,T)==0){
            return i;
        }
    }
    return 0;
}

bool Replace_Str(SString& S,SString T,SString V)//用串V替换主串S中的串T
{
    int lenV=V[0],lenS=S[0];
    SString Sub;
    for(int i=1;i<=lenS-lenV+1;i++){
        Sub_Str(Sub,S,i,lenV);
        if(Compare_Str(Sub,T)==0){
            for(int j=i;j<=lenV+i-1;j++){
                S[j]=V[j-i+1];
            }
        }
    }
    return true;
}

bool Insert_Str(SString& S,int pos,SString T)//插入串T到主串S的pos位置前
{//1<=pos<=S[0]+1
    if(pos<1||pos>S[0]+1)
        return false;
    if(T[0]+S[0]>MaxStrLen){
        cout<<"空间不够,插入失败\n";
        return false;
    }
    else{
        for(int i=S[0];i>=pos;i--){
            S[i+T[0]]=S[i];
        }
        for(int j=pos;j<=T[0]+pos-1;j++){
            S[j]=T[j-pos+1];
        }
        S[0]+=T[0];
    }
    return true;
}

bool Delete_Str(SString& S,int pos,int len)//删除主串从pos位置后的len个元素
{
    for(int i=len+pos;i<=S[0];i++){
        S[i-len]=S[i];
    }
    S[0]-=len;
    return true;
}

bool Destroy_Str(SString& S)//破坏串S
{
    //不存在静态数组的销毁吧?网上查的也是静态数组不能销毁
}

int main()
{
    //读者可以根据需要自行测试,我写的测试比较多,而且太乱了
}


//读者自行测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值