字符串定长顺序存储表示模板
2015-12-11 03:08
393 查看
///page71 ///测试样例:nihao ///output /*5 5 nihao 0 10 nihaonihao 4 aoni 4 14 nihaoaoninihao 9 noninihao 13 nombxzmbxzhao*/ #include <stdio.h> #include <stdlib.h> #include<string.h> #include <malloc.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define maxlen 255 typedef char sstring[maxlen+1]; typedef int status; int StrLength(sstring s){ int cnt=0; for(int i=0;s[i];i++) cnt++; return cnt; } status StrAssign(sstring &t,char *chars){ if(StrLength(chars)>maxlen) return ERROR; t[0]=StrLength(chars); for(int i=1;i<=t[0];i++) t[i]=*(chars+i-1); t[t[0]+1]='\0'; } void clears(sstring &s){ s[0]=0; } void StrCopy(sstring &s,sstring t){// 由串S复制得串T int i; for(i=0;i<=t[0];i++) s[i]=t[i]; s[s[0]+1]='\0'; } status StrEmpty(sstring s){// 若S为空串,则返回TRUE,否则返回FALSE if(s[0]==0) return TRUE; else return FALSE; } int StrCompare(sstring s,sstring t){// 初始条件:串S和T存在。操作结果:若S>T,则返回值>0; //若S=T,则返回值=0;若S<T,则返回值<0 int i; 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]; } status concat(sstring &t,sstring s1,sstring s2){ if(s1[0]+s2[0]<=maxlen){ for(int i=1;i<=s1[0];i++) t[i]=s1[i]; for(int i=1;i<=s2[0];i++) t[i+s1[0]]=s2[i]; t[0]=s1[0]+s2[0]; t[t[0]+1]='\0'; } else if(s1[0]<maxlen){ for(int i=1;i<=s1[0];i++) t[i]=s1[i]; for(int i=1;i<=maxlen-s1[0];i++) t[i+s1[0]]=s2[i]; t[0]=maxlen; } else{ for(int i=1;i<=maxlen;i++) t[i]=s1[i]; t[0]=maxlen; } } status SubString(sstring &Sub,sstring S,int pos,int len)// 用Sub返回串S的第pos个字符起长度为len的子串。 { int i; if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1) return ERROR; for(i=1;i<=len;i++) Sub[i]=S[pos+i-1]; Sub[0]=len; Sub[len+1]='\0'; return OK; } int Index(sstring S,sstring T,int pos){// 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。 int i,j; if(1<=pos&&pos<=S[0]){ i=pos; j=1; while(i<=S[0]&&j<=T[0]){ if(S[i]==T[j]) // 继续比较后继字符 { ++i; ++j; } else // 指针后退重新开始匹配 { i=i-j+2; j=1; } } if(j>T[0]) return i-T[0]; else return 0; } else return 0; } status StrInsert(sstring &S,int pos,sstring T){// 在串S的第pos个字符之前插入串T。 int i; //完全插入返回TRUE,部分插入返回FALSE if(pos<1||pos>S[0]+1) return ERROR; if(S[0]+T[0]<=maxlen){ // 完全插入 for(i=S[0];i>=pos;i--) S[i+T[0]]=S[i]; for(i=pos;i<pos+T[0];i++) S[i]=T[i-pos+1]; S[0]+=T[0]; S[S[0]+1]='\0'; return TRUE; } else{ // 部分插入 for(i=maxlen;i>=pos+T[0];i--) S[i]=S[i-T[0]]; for(i=pos;i<pos+T[0]&&i<=maxlen;i++) S[i]=T[i-pos+1]; S[0]=maxlen; return FALSE; } } status StrDelete(sstring &S,int pos,int len){//从串S中删除第pos个字符起长度为len的子串 int i; if(pos<1||pos>S[0]-len+1||len<0) return ERROR; for(i=pos+len;i<=S[0];i++) S[i-len]=S[i]; S[0]-=len; S[S[0]+1]='\0'; return OK; } status Replace(sstring &S,sstring T,sstring V) // 用V替换主串S中出现的所有与T相等的不重叠的子串 { int i=1; // 从串S的第一个字符起查找串T status k; if(StrEmpty(T)) // T是空串 return ERROR; do { i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置 if(i) // 串S中存在串T { StrDelete(S,i,T[0]); // 删除该串T k=StrInsert(S,i,V); // 在原串T的位置插入串V if(!k) // 不能完全插入 return ERROR; i+=V[0]; // 在插入的串V后面继续查找串T } }while(i); S[S[0]+1]='\0'; return OK; } int main(){ sstring s,t,in; scanf("%s",in); //scanf("%s",t); StrAssign(t,in); printf("%d\n",t[0]); StrCopy(s,t); printf("%d %s\n",s[0],s+1); printf("%d\n",StrCompare(s,t)); sstring all; concat(all,s,t); printf("%d %s\n",all[0],all+1); sstring sub; SubString(sub,all,4,4); printf("%d %s\n",sub[0],sub+1); int locate=Index(all,sub,2); printf("%d\n",locate); StrInsert(all,6,sub); printf("%d %s\n",all[0],all+1); StrDelete(all,2,5); printf("%d %s\n",all[0],all+1); sstring s1,s2; s1[0]=2; s1[1]='n',s1[2]='i',s1[3]='\0'; s2[0]=4,s2[1]='m',s2[2]='b',s2[3]='x',s2[4]='z',s2[5]='\0'; Replace(all,s1,s2); printf("%d %s\n",all[0],all+1); return 0; }
相关文章推荐
- 支线任务-6
- C++专题(三)
- malloc和free函数详解
- Python机器学习数据挖掘工具sklearn安装和使用
- OpenGL ES 学习教程(七) 瞎子打灯,照亮他人,浅谈Ambient Lighting 环境光照
- Mapped Statements collection does not contain value for
- SetWaitableTimer定时器的使用
- iOS多线程之GCD学习笔记
- [python] 使用Jieba工具中文分词及文本聚类概念
- 每天一个linux命令之coreutils包: base64命令
- 监控Hbase是否可用的外挂程序
- 《近匠》AR学校:从教育领域看增强现实机遇何在
- mybatis 中mapper 的namespace有什么用
- Qumulo仪表盘前端开发技术:React + D3.js
- BZOJ3821 : 玄学
- 随机梯度下降(SGD)
- OpenGL ES 学习教程(七) 事实上并没有所谓的灯光,只是大家都装作发亮
- 每天一个linux命令之coreutils包: [命令
- DLch1
- 公钥和私钥