C++程序代码-C结构串.doc_第1页
C++程序代码-C结构串.doc_第2页
C++程序代码-C结构串.doc_第3页
C++程序代码-C结构串.doc_第4页
C++程序代码-C结构串.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include#include#includestr.hvoid IniString(String *s,const char *c)/准构造函数int len=strlen(c);/计算字符串长度s-str=(char*)malloc(len+1);/给本串s分配字符串空间if(s-str=NULL)StrError(overflow!);strcpy(s-str,c);/给本串的字符串空间赋值s-size=len;/记录本串的串长void FreeString(String *s)/准析构函数free(s-str);/释放本串的字符串空间String* Copy(String *s,const String *s1)/将结构串s1赋值给本串sif(s-size!=s1-size)free(s-str);/释放本串的字符串空间s-str=(char*)malloc(s1-size+1);/重新分配本串的字符串空间if(s-str=NULL)StrError(overflow!);s-size=s1-size;/修改本串的字符长度strcpy(s-str,s1-str);/给本串的字符串赋值return(s);/返回本串String * Assign(String *s,const char *c)/把字符串c赋值给本串sint len=strlen(c);/计算字符串长度if(s-size!=len)free(s-str);/释放本串的字符串空间s-str=(char*)malloc(len+1);/重新分配本串的字符串空间if(s-str=NULL)StrError(overflow!);s-size=len;/修改本串的字符长度strcpy(s-str,c);/给本串的字符串赋值return(s);String* Concat(const String *s,const String *s1,String *s2)/把结构串s和s1连接,存储到目标串s2int len=s-size+s1-size;/计算连接后的串长度free(s2-str);/释放目标串的字符串空间s2-str=(char*)malloc(len+1);/重新分配目标串的字符串空间if(s2-str=NULL)StrError(overflow!);strcpy(s2-str,s-str);/将结构串s的字符串拷贝目标串s2的字符串空间strcat(s2-str,s1-str);/将目标串s2的字符串和结构串s1的字符串连接s2-size=len;/修改目标串s2的字符串长度 return(s2);String *SubInsert(String *s,int id,const String *s1)/在本串s的下标id处插入子串s1。char *p, *p1,*buf;int len=s-size;/记录本串长度int len1=s1-size;/记录子串长度int left=len-id;/计算移动的字符个数int i;if(idlen)/检验插入位置的合法性 StrError(id illegal!); /步骤1)buf =s-str;/保留本串的字符串s-str=(char *)malloc(len+len1+1);/重新分配本串的字符串空间if(s-str=NULL)StrError(overflow!);strcpy(s-str, buf);/取回保留的字符串free(buf);/释放保留字符串的空间/步骤2)p=s-str+len;/指向本串结束符p1=p+len1;/指向本串结束符移动的终点for(i=1;istr+id;/指向插入的起始位置p1=s1-str;/指向待插子串的起始位置while(*p1!=0)/逐个字符插入*p+=*p1+;s-size=len+len1;/修改本串的长度return(s);/返回插入后的本串/把本串分为前、中、后三段,中段为待删除子串,前段和后段连接String *SubErase(String *s,int id,int num) char *p,*q,*buf; int len=s-size;/记录本串长度int left=len-id;/计算中后段字符个数if(idlen-1)/检验删除起始位置的合法性StrError(id illegal!);if(numleft)/检验删除字符个数的合法性StrError(num illegal!);/步骤1)p=s-str+id;/指向中段首字符q=s-str+id+num;/指向后段首字符while(*q!=0)/前段和后段连接*p+=*q+;*p=0;/加串结束符/步骤2)buf=s-str;/保留本串s的字符串/步骤3)len=strlen(buf);/计算删除后串长度s-str=(char *)malloc(len+1);/重新分配本串的字符串空间if(s-str=NULL)StrError(overflow!);strcpy(s-str,buf);/取回保留的字符串s-size=len;/修改本串的字符串长度free(buf);/释放buf指向的字符串空间return(s);/返回删除后的本串String *SubString(const String *s,int id,int num,String *s1)char *p, *p1;int len=s-size;/记录本串长度int left=len-id,i;/计算从位置id开始的剩余字符个数if(idlen-1)|id0)/检验起始位置的合法性StrError(id illegal!);if(numleft)/检验子串个数的合法性StrError(num illegal!);/步骤1)if(s1-size!=num)free(s1-str);/释放目标串s1的字符串空间s1-str=(char*)malloc(num+1);/重新分配目标串s1的字符串空间if(s1-str=NULL)StrError(overflow!);s1-size=num;/修改目标串s1的长度/步骤2)p=s-str+id;/指向本串中要提取子串的起始位置p1=s1-str;/指向目标串s1的起始位置for(i=1;i=num;i+)/把本串中提取的字符串赋给目标串s1*p1+=*p+;*p1=0;/加串结束符 return(s1);int ChFind(const String *s,char ch,int start)/从start开始查找ch首次出现的位置,并作为返回值int i=start;char *p;if(starts-size-1)/检验查找起始位置合法性StrError(Start illegal!); p=s-str+start;while(*p!=0)if(*p=ch)break;elsei+;p+;return(*p=0?-1:i);char StrGetData(const String *s,int id)/取下标为id的字符if(ids-size-1)/检验位置合法性StrError(Id illegal!);return(s-strid);int Compare(const String *s,const String *s1)/两个结构串比较return(strcmp(s-str,s1-str);int Size(const String *s)/求串长return(s-size);int StrEmpty(const String *s)/判串空return(s-size=0);char* Str(const String *s)/取本串的字符串指针char* c=(char*)malloc(s-size);strcpy(c,s-str);return(c);void StrError(const char *c)/错误信息报告printf(%s,c);exit(1);int PatFind(const String *s,const String *p,int start)int len=Size(s),plen=Size(p);/取源串和模式串的长度char pfirst=StrGetData(p,0),plast=StrGetData(p,plen-1); /取模式串首尾字符int firstid,lastid;/用来记录源串中与模式串首尾字符对应的字符下标int token=-1;/记录查找结果String pmid,smid;/用来存放源串和模式串的子串IniString(&pmid,);IniString(&smid,);if(plen=1)/若模式串长度为1,则子串查找转为字符查找token=ChFind(s,pfirst,start);else if(plen=2)/若模式长度不小于2,取模式串首尾字符中间的子串SubString(p,1,plen-2,&pmid);/取模式串首尾字符中间的子串firstid=ChFind(s,pfirst,start);/在源串中查找模式串的首字符lastid=firstid+plen-1;/取源串中与模式串尾字符位置对应的下标while(firstid!=-1&lastidlen)/若源串包含模式串首字符且尾字符对应的位置不越界if(StrGetData(s,lastid)=plast)/如果尾字符相等SubString(s,firstid+1,plen-2,&smid);/取源串的中间串if(Compare(&smid,&pmid)=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论