zoukankan      html  css  js  c++  java
  • 字符串定长顺序存储表示模板

      1 ///page71
      2 ///测试样例:nihao
      3 ///output
      4 /*5
      5 5    nihao
      6 0
      7 10 nihaonihao
      8 4  aoni
      9 4
     10 14 nihaoaoninihao
     11 9 noninihao
     12 13 nombxzmbxzhao*/
     13 #include <stdio.h>
     14 #include <stdlib.h>
     15 #include<string.h>
     16 #include <malloc.h>
     17 #define TRUE 1
     18 #define FALSE 0
     19 #define OK 1
     20 #define ERROR 0
     21 #define INFEASIBLE -1
     22 #define OVERFLOW -2
     23 #define maxlen 255
     24 typedef  char sstring[maxlen+1];
     25 typedef int status;
     26 int StrLength(sstring s){
     27     int cnt=0;
     28       for(int i=0;s[i];i++)
     29         cnt++;
     30       return cnt;
     31 }
     32 status StrAssign(sstring &t,char *chars){
     33         if(StrLength(chars)>maxlen)
     34             return ERROR;
     35         t[0]=StrLength(chars);
     36         for(int i=1;i<=t[0];i++)
     37             t[i]=*(chars+i-1);
     38             t[t[0]+1]='';
     39 }
     40 void clears(sstring &s){
     41     s[0]=0;
     42 }
     43 void StrCopy(sstring &s,sstring t){// 由串S复制得串T
     44     int i;
     45     for(i=0;i<=t[0];i++)
     46         s[i]=t[i];
     47         s[s[0]+1]='';
     48 }
     49 status StrEmpty(sstring s){// 若S为空串,则返回TRUE,否则返回FALSE
     50     if(s[0]==0)
     51         return TRUE;
     52     else
     53         return FALSE;
     54 }
     55 int StrCompare(sstring s,sstring t){// 初始条件:串S和T存在。操作结果:若S>T,则返回值>0;
     56                                    //若S=T,则返回值=0;若S<T,则返回值<0
     57     int i;
     58     for(i=1;i<=s[0]&&i<=t[0];++i)
     59         if(s[i]!=t[i])
     60             return s[i]-t[i];
     61     return s[0]-t[0];
     62 }
     63 status concat(sstring &t,sstring s1,sstring s2){
     64         if(s1[0]+s2[0]<=maxlen){
     65             for(int i=1;i<=s1[0];i++)
     66                 t[i]=s1[i];
     67             for(int i=1;i<=s2[0];i++)
     68                 t[i+s1[0]]=s2[i];
     69             t[0]=s1[0]+s2[0];
     70             t[t[0]+1]='';
     71         }
     72         else if(s1[0]<maxlen){
     73                for(int i=1;i<=s1[0];i++)
     74                 t[i]=s1[i];
     75                 for(int i=1;i<=maxlen-s1[0];i++)
     76                     t[i+s1[0]]=s2[i];
     77             t[0]=maxlen;
     78         }
     79         else{
     80             for(int i=1;i<=maxlen;i++)
     81                 t[i]=s1[i];
     82             t[0]=maxlen;
     83         }
     84 }
     85 status SubString(sstring &Sub,sstring S,int pos,int len)// 用Sub返回串S的第pos个字符起长度为len的子串。
     86 {
     87     int i;
     88     if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
     89         return ERROR;
     90     for(i=1;i<=len;i++)
     91         Sub[i]=S[pos+i-1];
     92     Sub[0]=len;
     93     Sub[len+1]='';
     94     return OK;
     95 }
     96 int Index(sstring S,sstring T,int pos){// 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
     97     int i,j;
     98     if(1<=pos&&pos<=S[0]){
     99         i=pos;
    100         j=1;
    101         while(i<=S[0]&&j<=T[0]){
    102             if(S[i]==T[j]) // 继续比较后继字符
    103             {
    104                 ++i;
    105                 ++j;
    106             }
    107             else // 指针后退重新开始匹配
    108             {
    109                 i=i-j+2;
    110                 j=1;
    111             }
    112             }
    113             if(j>T[0])
    114                 return i-T[0];
    115             else
    116                 return 0;
    117     }
    118     else
    119         return 0;
    120 }
    121 status StrInsert(sstring &S,int pos,sstring T){// 在串S的第pos个字符之前插入串T。
    122     int i;                                     //完全插入返回TRUE,部分插入返回FALSE
    123     if(pos<1||pos>S[0]+1)
    124         return ERROR;
    125     if(S[0]+T[0]<=maxlen){ // 完全插入
    126         for(i=S[0];i>=pos;i--)
    127             S[i+T[0]]=S[i];
    128         for(i=pos;i<pos+T[0];i++)
    129             S[i]=T[i-pos+1];
    130         S[0]+=T[0];
    131         S[S[0]+1]='';
    132         return TRUE;
    133     }
    134     else{ // 部分插入
    135         for(i=maxlen;i>=pos+T[0];i--)
    136             S[i]=S[i-T[0]];
    137         for(i=pos;i<pos+T[0]&&i<=maxlen;i++)
    138             S[i]=T[i-pos+1];
    139         S[0]=maxlen;
    140 
    141         return FALSE;
    142     }
    143 }
    144 status StrDelete(sstring &S,int pos,int len){//从串S中删除第pos个字符起长度为len的子串
    145     int i;
    146     if(pos<1||pos>S[0]-len+1||len<0)
    147         return ERROR;
    148     for(i=pos+len;i<=S[0];i++)
    149         S[i-len]=S[i];
    150     S[0]-=len;
    151     S[S[0]+1]='';
    152     return OK;
    153 }
    154 
    155 status Replace(sstring &S,sstring T,sstring V) // 用V替换主串S中出现的所有与T相等的不重叠的子串
    156 {
    157     int i=1; // 从串S的第一个字符起查找串T
    158     status k;
    159     if(StrEmpty(T)) // T是空串
    160         return ERROR;
    161     do
    162     {
    163         i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
    164         if(i) // 串S中存在串T
    165         {
    166             StrDelete(S,i,T[0]); // 删除该串T
    167             k=StrInsert(S,i,V); // 在原串T的位置插入串V
    168             if(!k) // 不能完全插入
    169                 return ERROR;
    170             i+=V[0]; // 在插入的串V后面继续查找串T
    171         }
    172     }while(i);
    173     S[S[0]+1]='';
    174     return OK;
    175 }
    176 
    177 int main(){
    178      sstring s,t,in;
    179     scanf("%s",in);
    180     //scanf("%s",t);
    181     StrAssign(t,in);
    182     printf("%d
    ",t[0]);
    183 
    184     StrCopy(s,t);
    185     printf("%d    %s
    ",s[0],s+1);
    186 
    187      printf("%d
    ",StrCompare(s,t));
    188 
    189      sstring all;
    190      concat(all,s,t);
    191      printf("%d %s
    ",all[0],all+1);
    192 
    193      sstring sub;
    194      SubString(sub,all,4,4);
    195      printf("%d  %s
    ",sub[0],sub+1);
    196 
    197      int locate=Index(all,sub,2);
    198      printf("%d
    ",locate);
    199 
    200       StrInsert(all,6,sub);
    201       printf("%d %s
    ",all[0],all+1);
    202 
    203     StrDelete(all,2,5);
    204     printf("%d %s
    ",all[0],all+1);
    205 
    206     sstring s1,s2;
    207     s1[0]=2;
    208     s1[1]='n',s1[2]='i',s1[3]='';
    209     s2[0]=4,s2[1]='m',s2[2]='b',s2[3]='x',s2[4]='z',s2[5]='';
    210     Replace(all,s1,s2);
    211      printf("%d %s
    ",all[0],all+1);
    212     return 0;
    213 }
  • 相关阅读:
    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
    AWS 免费套餐
    SQL Server全时区转换
    SQL Server 连接问题案例解析(1)
    SQL Saturday活动再起
    SqlServerProxy的一些资料
    数据是企业的无价財富——爱数备份存储柜server的初体验(图文)
    JEECG第二期深入使用培训(报名截止2014-06-21)
    Java提高篇(三三)-----Map总结
    经常使用哈希函数的比較及其C语言实现
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5037878.html
Copyright © 2011-2022 走看看