数据结构(严蔚敏)4.2堆分配串

学习记录,仅供参考,希望可以指出错误

#include<stdio.h>
#include<stdlib.h>
#include<string>
typedef struct{
    char *ch;
    int length;
}HString;
//下表是从0开始的,不是像定长一样从1

//typedef char Status;

//StrAssign(&T,chars)创建串T
//StrCopy(&T,S)拷贝
//StrEmpty(S)判空
//StrCompare(S,T) S>T返回值>0
//Strlen(S)
//ClearString(&S)
//Concat(&T,S1,S2)T由S1和S2连接
//SubString(&Sub,S,pos,len)用Sub返回串S的第pos个字符起长度为len的字串
//Index(S,T,pos)若S中存在和T值相同的字串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0
//Replace(&S,T,V)用V替换主串S中出现的所有与T相等的不重叠的子串
//StrInsert(&S,pos,T)在串S的第pos个字符后插入T
//StrDelete(&S,pos,len)删除第pos个字符起长度为len的子串
//DestoryString(&S)
int print(HString t){
    if(t.length==0) printf("长度为0\n");
    else
    for(int i=0;i<t.length;i++)
        printf("%c",t.ch[i]);
    return 0;
}
int Strlen(HString s){
    return s.length;

}

int StrAssign(HString &t,char *chars){

    if(Strlen(t)>0)
        free(t.ch);
    if(Strlen(t)==0) t.ch=NULL;
    else{
    t.length=strlen(chars);
    if(!(t.ch=(char*)malloc(t.length*sizeof(char))))return 1;
    for(int i=0;i<Strlen(t);i++){
        for(int i=0;i<Strlen(t);i++)
        t.ch[i]=chars[i];
    }
    }
    return 0;
}

int StrCopy(HString &t,HString s){
    if(Strlen(t)>0)
        free(t.ch);
    t.length=Strlen(s);
    t.ch=(char*)malloc(Strlen(t)*sizeof(char));
    if(!t.ch)return 1;
    for(int i=0;i<Strlen(t);i++){
        t.ch[i]=s.ch[i];
    }
    return 0;

}

int StrEmpty(HString t){
    if(t.length==0)return 1;
    else return 0;
}

int StrCompare(HString s,HString t){
    if(Strlen(s)>Strlen(t))return 1;
    else if(Strlen(s)<Strlen(t))return -1;
    for(int i=0;i<Strlen(s);i++){
        if(s.ch[i]>t.ch[i]) return 1;
        else if(s.ch[i]<t.ch[i])return -1;
    }
    return 0;
}

int ClearString(HString &t){
    if(t.length==0)return 1;
    if(t.length>0){
        free(t.ch);
        t.length=0;        t.ch=NULL;
        return 1;
    }
    return 0;
}

int StrInsert(HString &s,int pos,HString t){
    //----------省略对参数判断--判断pos是否合理
    int slen=Strlen(s),tlen=Strlen(t);
    if(!(s.ch=(char *)realloc(s.ch,(slen+tlen) * sizeof(char)))) return 1;
    for(int i=tlen+slen,j=slen;i>pos;j--,i--){//后撤步777
        s.ch[i]=s.ch[j];
    }
    for(int j=0;j<tlen;j++){
        s.ch[pos+j]=t.ch[j];
    }
    s.length=slen+tlen;
    return 1;
}

int StrDelete(HString &t,int pos,int len){
    //----------省略对参数判断
    int tlen=Strlen(t);
    for(int i=0;i<tlen-len-pos;i++){//slen-pos-len是要移动的次数
        t.ch[pos+i]=t.ch[pos+len+i];
    }
    if(!(t.ch=(char *)realloc(t.ch,(tlen-len) * sizeof(char)))) return 1;
    t.length=t.length-len;
    return 1;
}

int DestoryString(HString &t){//不会写
    free(t.ch);
    t.length=0;
    return 1;
}

void Concat(HString &T,HString S1,HString S2){
    //----------省略对参数判断--判断S1和S2是否合理
    StrCopy(T,S1);
    StrInsert(T,Strlen(T),S2);
}

int SubString(HString &Sub,HString S,int pos,int len){
    //----------省略对参数判断--判断pos是否合理,<pos+len是否超过长度等
    if(!(Sub.ch=(char*)malloc(len*sizeof(char))))return 0;
    for(int i=0;i<len;i++)
        Sub.ch[i]=S.ch[pos+i];
    Sub.length=len;
    return 1;
}

int Index(HString S,HString T,int pos){//若S中存在和T值相同的字串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0
    //----------省略对参数判断--pos是否合理
    for(;pos<=Strlen(S)-Strlen(T);pos++){
        int j=0;
        for(int k=pos;j<Strlen(T);j++,k++){
            if(S.ch[k]!=T.ch[j]){
                break;
            }
        }
        if(j==Strlen(T)) return pos;
    }
    return -1;
}

void Replace(HString &S,HString T,HString V){//用V替换主串S中出现的所有与T相等的不重叠的子串
        //----------省略对参数判断--比较STV的长度
    int pos=0;
    while(true){
        pos=Index(S,T,pos);
        if(pos!=-1){
            StrDelete(S,pos,Strlen(T));
            StrInsert(S,pos,V);
            pos=pos+1;
        }else
            break;
    }

}
void main(){
    HString t1;
    char *chars="abcde";
    printf("\n\n测试 StrAssign----------------------------------------\n\n");
    StrAssign(t1,chars);
    print(t1);

    printf("\n\n测试 StrCopy----------------------------------------\n\n");
    HString t2;
    StrCopy(t2,t1);
    print(t1);printf("\n");
    print(t2);printf("\n");

    printf("\n\n测试 ClearString StrEmpty----------------------------------------\n\n");
    ClearString(t2);
    if(StrEmpty(t2)) printf("t2空了\n");;
    printf("\n");

    printf("\n\n测试 StrCompare  StrInsert_1----------------------------------------\n\n");
    print(t1);printf("\n");
    StrCopy(t2,t1);
    print(t2);printf("\n");
    HString t3;
    char *chars2="123";
    StrAssign(t3,chars2);
    StrInsert(t3,1,t2);
    print(t3);
    printf("\ncompare:%d\n\n",StrCompare(t1,t3));

    printf("\n\n测试 StrDelete_3_3----------------------------------------\n\n");
    StrDelete(t3,3,3);
    print(t3);

    printf("\n\n测试 StrInsert t1 t3---------------------------------------\n\n");
    printf("t1:");print(t1);printf("\n");
    printf("t3:");print(t3);printf("\n");
    HString t4;
    Concat(t4,t1,t3);
    printf("t1+t3---len:%d t4:",Strlen(t4));print(t4);printf("\n");

    printf("\n\n测试 SubString---------------------------------------\n\n");
    HString t5;
    SubString(t5,t4,2,4);
    printf("t5:");print(t5);printf("\n");

    printf("\n\n测试 Index--------------------------------------\n\n");
    HString t6;char *chars3="ab";
    StrAssign(t6,chars3);
    printf("Index(t4,t6,1): %d",Index(t4,t6,1));



    printf("\n\n测试 Replace--------------------------------------\n\n");
    printf("t4:");print(t4);printf("\n");
    printf("t6:");print(t6);printf("\n");
    printf("t2:");print(t2);printf("\n");
    Replace(t4,t6,t2);
    printf("Replace 把t4中的t6换成t2  t4: ");print(t4);printf("\n");

    printf("\n");
}

 

上一篇:java后端验证后前台直接上传oss


下一篇:HDU 2087 剪花布条