• 字符串的顺序表


    #include<iostream>
    using namespace std;
    typedef struct{
    char data[100];
    int length;
    } SqString;
    //串赋值
    void assign(SqString &s,char a[]){
            int i=0;
            while(a[i]!=''){
                    s.data[i]=a[i];
                    i++;
            }
            s.length=i;
    }
    
    //串复制
    void strcpy(SqString &s,SqString t){
            for(int i=0;i<t.length;i++){
                    s.data[i]=t.data[i];
            }
            s.length=t.length;
    }
    //求串长
    int getLength(SqString s){
            return s.length;
    }
    //判断串相等
    int isEquel(SqString s,SqString t){
            if(s.length!=t.length){
                    return 0;
            }else{
                    for(int i=0;i<s.length;i++){
                            if(s.data[i]!=t.data[i]){
                                    return 0;
                            }
                    }
                    return 1;
            }
    }
    
    //串连接
    SqString concat(SqString s,SqString t){
            SqString rst;
            for(int i=0;i<s.length;i++){
                    rst.data[i]=s.data[i];
            }
            for(int j=0;j<t.length;j++){
                    rst.data[j+s.length]=t.data[j];
            }
            rst.length=s.length+t.length;
    return rst;
    }
    //求子串
    SqString getSon(SqString &s,int i,int l){
            SqString rst;
            if(i<1||l<1||l>s.length||i+l-1>s.length){
                    rst.length=0;
            }else{
                    for(int j=i-1;j<i+l-1;j++){
                            rst.data[j-i+1]=s.data[j];
                    }
                    rst.length=l;
            }
            return rst;
    }
    //查找定位位置
    int index(SqString s,SqString t){
            int i=0;
            int j=0;
            while(i<s.length&&j<t.length){
                    if(s.data[i]==t.data[j]){
                            i++;
                            j++;
                    }else{
                            i=i-j+1;
                            j=0;
                    }
            } //此处返回的逻辑位置有点难理解
            if(j>=t.length){
                    return i-t.length+1;//返回子串的实际开始位置 i-t.length得到逻辑开始位置
            }else{
                    return 0;
            }
    }
    //子串插入
    /*
    思路:
    先将第i个位置开始的元素后移动t.length个位置
    再将t的值插入
    
    */
    int insStr(SqString &s,SqString t,int i){
            for(int j=s.length-1;j>=i-1;j--){
                    s.data[j+t.length]=s.data[j];//注意是空出t.length个位置
            }
            for(int j=0;j<t.length;j++){
                    s.data[i-1+j]=t.data[j];
            }
            s.length=s.length+t.length;
    }
    
    //子串删除
    /*
    从第i-1个位置开始删除l个元素
    应该将i+l-1开始的元素向前移动l个位置
    直到到末尾
    
    */
    int delStr(SqString &s,int i,int l){
            if(i<1||l<1||l>s.length||i+l-1>s.length){
                    return 0;
            }else{
                    for(int j=i+l-1;j<s.length;j++){
                            s.data[j-l]=s.data[j];
                    }
                    s.length=s.length-l;
                    return 1;
            }
    }
    //显示
    void disStr(SqString s){
            cout<<endl;
            for(int i=0;i<s.length;i++){
                    cout<<s.data[i]<<" ";
            }
            cout<<endl;
    }
    //子串替换
    void replaceStr(SqString &s,SqString t,SqString r){
       int i = index(s,t);//获取位置
       while(i!=0){
              delStr(s,i,t.length);
              insStr(s,r,i);
              disStr(s);
              i = index(s,t);
       }
    }
    
    
    int main(){
            /*
            字符串的基本运算
            串赋值 assign
            串复制 strcpy
            求串长 getLength
            判断串相等 isEquel
            串连接 concat
            求子串 getSon
     查找定位位置 index
            子串插入 insStr
            子串删除 delStr
            子串替换 replaceStr
            输出串 disStr
    
            */
            SqString s,s2,rst,r;
          char a[]="world",b[]="helloworldsdfworld",c[]="l";
            assign(s,a);
            assign(r,c);
            assign(s2,b);
            cout<<"s2长度"<<getLength(s2)<<endl;
            disStr(s2);
            strcpy(rst,s);
            disStr(rst);
            disStr(concat(s2,s));
            disStr(s);
            if(isEquel(s,s2)){
              cout<<"相等";
            }else{
              cout<<"不相等";
            }
    
            delStr(s,4,3);
            disStr(s2);
            disStr(s);
            disStr(r);
            replaceStr(s2,s,r);
            disStr(s2);
            assign(s,a);
            assign(r,c);
            assign(s2,b);
            cout<<"s的长度"<<getLength(s)<<"如下"<<endl;
            disStr(s);
            cout<<"r的长度"<<getLength(r)<<"如下"<<endl;
            disStr(r);
            cout<<"s2的长度"<<getLength(s2)<<"如下"<<endl;
            disStr(s2);
            cout<<index(s2,s);
            replaceStr(s2,s,r);
            disStr(s2);
            return 0;
    }




    结果:
     
  • 相关阅读:
    二叉树逻辑结构重点
    循环链表
    数据结构 单链表
    《深入理解计算机系统》第7章:重定位PC相对引用的理解
    一个关于空指针的思考
    简单解决python安装中的Unable to find vcvarsall.bat问题
    解决python本地离线安装requests问题
    使用共享内存和信号量模拟实现多进程会话
    使用openssl演练数字签名
    简单了解C语言内嵌汇编
  • 原文地址:https://www.cnblogs.com/webcyh/p/11393578.html
Copyright © 2020-2023  润新知