【数据结构】串的顺序表示

参考资料:《数据结构(C语言版)严蔚敏著》
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...


串的顺序表示

串的顺序表示即用一组地址连续的存储单元存储串值的字符序列。常采用数组来存储串,根据数组空间的分配方式,有两种描述方法:静态分配、动态分配。

静态分配

#define MAXSTRLEN 255    //最大串长
typedef unsigned char SString[MAXSTRLEN+1];  //0号单元存放串的长度

动态分配 

typedef struct{
    char *ch;
    int length;
}HString;

顺序串上基本操作的实现 

1、赋值

Status StrAssign(SString &T, chat *chars){
    for(i=0, c=chars; *c; ++i, ++c);
    if(i>MAXSTRLEN) return ERROR;
    T[1..i]=chars[0..i-1];
    T[0]=i;
    return OK;
}

Status StrAssign(HString &T, char *chars){
    if(T.ch) free(T.ch);
    for(i=0, c=chars; *c; ++i, ++c);    //求chars的长度i
    if(!i) { T.ch=NULL; T.length=0; }
    else{
        if(!(T.ch=(char*)malloc(i*sizeof(char))))
            exit(OVERFLOW);
        T.ch[0..i-1]=chars[0..i-1];
        T.length=i;
    }
    return OK;
}

2、复制 

Status StrCopy(SString &T, SString S){
    T[0..S[0]]=S[0..S[0]];
    return OK;
}

Status StrCopy(HString &T, HString S){
    if(T.ch) free(T.ch);
    if(!S.length) { T.ch=NULL; T.length=0; }
    else{
        if(!(T.ch=(char*)malloc(i*sizeof(char))))
            exit(OVERFLOW);
        T.ch[0..S.length-1]=S.ch[0..S.length-1];
        T.length=S.length;
    }
    return OK;
}

3、判空

Status StrEmpty(SString S){
    if(!S[0]) return TRUE;
    return FALSE;
}

Status StrEmpty(HString S){
    if(!S.length) return TRUE;
    return FALSE;
}

4、比较

int StrCompare(SString S, SString T){
    for(i=1; i<S[0] && i<T[0]; ++i)
        if(S[i]!=T[i]) return S[i]-T[i];
    return S[0]-T[0];
}

int StrCompare(HString S, HString T){
    for(i=0; 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;
}

5、串长 

int StrLength(SString S){
    retrun S[0];
}

int StrLength(HString S){
    retrun S.length;
}

6、清空

Status ClearString(SString &S){
    S[0]=0;
    return OK;
}

Status ClearString(HString &S){
    S.length=0;
    return OK;
}

7、连接 

Status Concat(SString &T, SString S1, SString S2){
    if(S1[0]+S2[0]<=MAXSTRLEN){
        T[1..S1[0]]=S1[1..S1[0]];
        T[S1[0]+1..S1[0]+S2[0]]=S2[1..S2[0]];
        T[0]=S1[0]+S2[0];
        uncut=TRUE;
    }
    else if(S1[0]<MAXSTRLEN){
        T[1..S1[0]]=S1[1..S1[0]];
        T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];
        T[0]=MAXSTRLEN;
        uncut=FALSE;
    }
    else{
        T[0..MAXSTRLEN]=S1[0..MAXSTRLEN];
        uncut=FALSE;
    }
    return uncut;
}

Status Concat(HString &T, HSTring S1, HString S2){
    if(T.ch) free(T.ch);
    if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))
        exit(OVERFLOW);
    T.ch[0..S1.length-1]=S1.ch[0..S1.length-1];
    T.length=S1.length+S2.length;
    T.ch[S1.length..T.length-1]=S2.ch[0..S2.length-1];
    return OK;
}

 8、子串 

Status SubString(SString &Sub, SString S, int pos, int len){
    if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
        return ERROR;
    Sub[1..len]=S[pos..pos+len-1];
    Sub[0]=len;
    return OK;
}

Status SubString(HString &Sub, HString S, int pos, int len){
    if(pos<1 || pos>S.length || len<0 || len>S.length-pos+1)
        return ERROR;
    if(Sub.ch) free(Sub.ch);
    if(!len) { Sub.ch=NULL; Sub.length=0; }
    else{
        Sub.ch=(char*)malloc(len*sizeof(char));
        Sub.ch[0..len-1]=S.ch[pos-1..pos+len-2];
        Sub.length=len;
    }
    return OK;
}

9、子串位置

int Index(SString S, SString T, int pos){
    i=pos; j=1;
    while(i<=S[0] && j<=T[0]){
        if(S[i]==T[i]) { ++i; ++j; }
        else{ i=i-j+2; j=1; }
    }
    if(j>T[0]) return i-T[0];
    else return 0;
}

int Index(HString S, HString T, int pos){
    i=pos-1; j=0;
    while(i<S.length && j<T.length){
        if(S.c[i]==T.c[i]) { ++i; ++j; }
        else{ i=i-j+1; j=0; }
    }
    if(j==T.length) return i-T.length;
    else return -1;
}

10、 替换

Status Replace(SString &S, SString T, SString V){
    
}

11、插入

Status StrInsert(SString &S, int pos, SString T){
    if(pos<1 || pos>S[0]+1 || S[0]+T[0]>MAXSTRLEN) return ERROR;
    for(i=S[0]; i>=pos; --i)
        S[i+T[0]]=S[i];
    S[pos..pos+T[0]-1]=T[1..T[0]];
    S[0]=S[0]+T[0];
}

Status StrInsert(HString &S, int pos, HString T){
    if(pos<1 || pos>S.length+1) return ERROR;
    if(T.length){
        if(!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char))))
            exit(OVERFLOW);
        for(i=S.length-1; i>=pos-1; --i)
            S.ch[i+T.length]=S.ch[i];
        S.ch[pos-1..pos+T.length-2]=T.ch[0..T.length-1];
        S.length+=T.length;
    }
    return OK;
}

12、删除

Status StrDelete(SString &S, int pos, int len){
    if(pos<1 || pos>S[0]-len+1) return ERROR;
    for(i=0; i<len && pos+len+i<S[0]; ++i){
        S[pos]=S[pos+len+i];
    }
    S[0]=S[0]-len;
    return OK;
}

13、销毁

Status DestroyString(HString &S){
    if(S.ch) free(S.ch);
    S.ch=NULL;
    return OK;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingrez

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值