数据结构-串实验报告.doc_第1页
数据结构-串实验报告.doc_第2页
数据结构-串实验报告.doc_第3页
数据结构-串实验报告.doc_第4页
数据结构-串实验报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

实验报告课程数据结构实验名称实验三 串学号姓名实验日期:2011/10/27实验三 串实验目的:1. 熟悉串类型的实现方法,了解简单文字处理的设计方法;2. 熟悉C语言的字符和把字符串处理的原理和方法;3. 熟悉并掌握模式匹配算法。实验原理:顺序存储结构下的关于字符串操作的基本算法。模式匹配算法BF、KMP实验内容: 4-19. 在4.4.3节例4-6的基础上,编写比较Brute-Force算法和KMP算法比较次数的程序。 4-20. 设串采用静态数组存储结构,编写函数实现串的替换Replace(S,start,T,V),即要求在主串S中,从位置start开始查找是否存在字串T。若主串S中存在子串T,则用子串V替换子串T,且函数返回1;若主串S中不存在子串T,则函数返回0;并要求设计主函数进行测试。一个测试例子为:S=“I am a student”,T=“student”,V=“teacher”。实验结果:4.19(1)SString.h/*静态存储结构*/typedef structchar strMaxSize;int length; String;void Initiate(String *S) S-length=0;int Insert(String *S, int pos, String T)/*在串S的pos位置插入子串T*/int i;if(pos length + T.length MaxSize)printf(数组空间不足无法插入!);return 0;elsefor(i = S-length-1; i = pos; i-)S-stri+T.length = S-stri;/*为插入做准备*/for(i = 0; i strpos+i = T.stri;/*插入*/S-length += T.length;/*产生新的元素个数*/return 1;int Delete(String *S, int pos, int len)int i;if(S-length = 0)printf(数组中未存放字符无元素可删! n);return 0;else if(pos 0 | len S-length)printf(参数pos和len出错);return 0;elsefor(i = pos+len; i length-1; i+)S-stri-len = S-stri;/*依次前移*/S-length -= len;/*产生新的长度值*/return 1;int SubString(String S, int pos, int len, String *T)int i;if(pos 0 | len S.length)printf(参数pos和len出错);return 0;else for(i = 0; i stri = S.strpos+i;/*给子串T赋值*/T-length = len;/*给子串T的长度域赋值*/return 1; (2) BFandKMP.h /*查找子串BF(Brute-Force)操作*/int BFIndex(String S,int start,String T) int i=start,j=0,v; while(iS.length&jT.length) if(S.stri=T.strj) i+; j+; else i=i-j+1; j=0; if(j=T.length) v=i-T.length; else v=-1; return v;int KMPIndexA(String S,int start,String T,int next) int i=start,j=0,v; while(iS.length&jT.length) if(j=-1|S.stri=T.strj) i+; j+; else j=nextj; if(j=T.length) v=i-T.length; else v=-1; return v;int KMPIndexB(String S,int start,String T,int next) int i=start,j=0,v; while(iS.length&jT.length) if(S.stri=T.strj) i+; j+; else if(j=0)i+; else j=nextj; if(j=T.length) v=i-T.length; else v=-1; return v;void GetNext(String T, int next)/*求子串T的nextj值并存放于数组next中*/ int j=1, k=0; next0=-1; next1=0; while(jT.length) if(T.strj=T.strk) nextj+1=k+1; j+; k+; else if(k=0) nextj+1=0; j+; else k=nextk; /*查找子串BF(Brute-Force)算法累计次数 */int BFIndexC(String S, int start, String T) int i= start, j=0, t=0; while(iS.length & jT.length) if(S.stri=T.strj) i+; j+; else i=i-j+1; j=0; t+; return t;/*查找子串KMP(D.E.Knuth-J.H.Morris-V.R.Pratt)操作 */int KMPIndexC(String S, int start, String T, int next) int i= start, j=0, t=0; while(iS.length & jT.length) if(S.stri=T.strj) i+; j+; else if(j=0) i+; else j=nextj; t+; return t; (3)测试主函数:#include#define MaxSize 100#includeSString.h#includeBFandKMP.hvoid main(void) String S=cddcdc,6, T=abcde,5; String S1=aaaaaa,6, T1=aaaab,5; String S2=aaaaaaaaaaaad,13, T2=aaaab,5; int next20, count; count=BFIndexC(S,0,T); printf(form S find T Brute-Forces times: %dn,count); GetNext(T, next); count=KMPIndexC(S,0,T,next); printf(form S find T KMPs times: %dn,count); count=BFIndexC(S1,0,T1); printf(form S1 find T1 Brute-Forces times: %dn,count); GetNext(T1, next); count=KMPIndexC(S1,0,T1,next); printf(form S1 find T1 KMPs times: %dn,count); count=BFIndexC(S2,0,T2); printf(form S2 find T2 Brute-Forces times: %dn,count); GetNext(T2, next); count=KMPIndexC(S2,0,T2,next); printf(form S2 find T2 KMPs times: %dn,count); printf(This program is made by 10273206n); 运行结果为:4.20(1) 建立头文件SString.h typedef structchar strMaxSize;int length; String;void Initiate(String *S) S-length=0;int Insert(String *S, int pos, String T)/*在串S的pos位置插入子串T*/int i;if(pos length + T.length MaxSize)printf(数组空间不足无法插入!);return 0;elsefor(i = S-length-1; i = pos; i-)S-stri+T.length = S-stri;/*为插入做准备*/for(i = 0; i strpos+i = T.stri;/*插入*/S-length += T.length;/*产生新的元素个数*/return 1;int Delete(String *S, int pos, int len)int i;if(S-length = 0)printf(数组中未存放字符无元素可删! n);return 0;else if(pos 0 | len S-length)printf(参数pos和len出错);return 0;elsefor(i = pos+len; i length-1; i+)S-stri-len = S-stri;/*依次前移*/S-length -= len;/*产生新的长度值*/return 1;int SubString(String S, int pos, int len, String *T)int i;if(pos 0 | len S.length)printf(参数pos和len出错);return 0;else for(i = 0; i stri = S.strpos+i;/*给子串T赋值*/T-length = len;/*给子串T的长度域赋值*/return 1;(2) 建立头文件BFandKMP.hint BFIndex(String S,int start,String T) int i=start,j=0,v; while(iS.length&jT.length) if(S.stri=T.strj) i+; j+; else i=i-j+1; j=0; if(j=T.length) v=i-T.length; else v=-1; return v;int KMPIndexA(String S,int start,String T,int next) int i=start,j=0,v; while(iS.length&jT.length) if(j=-1|S.stri=T.strj) i+; j+; else j=nextj; if(j=T.length) v=i-T.length; else v=-1; return v;int KMPIndexB(String S,int start,String T,int next) int i=start,j=0,v; while(iS.length&jT.length) if(S.stri=T.strj) i+; j+; else if(j=0)i+; else j=nextj; if(j=T.length) v=i-T.length; else v=-1; return v;void GetNext(String T, int next)/*求子串T的nextj值并存放于数组next中*/ int j=1, k=0; next0=-1; next1=0; while(jT.length) if(T.strj=T.strk) nextj+1=k+1; j+; k+; else if(k=0) nextj+1=0; j+; else k=nextk; /*查找子串BF(Brute-Force)算法累计次数 */int BFIndexC(String S, int start, String T) int i= start, j=0, t=0; while(iS.length & jT.length) if(S.stri=T.strj) i+; j+; else i=i-j+1; j=0; t+; return t;/*查找子串KMP(D.E.Knuth-J.H.Morris-V.R.Pratt)操作 */int KMPIndexC(String S, int start, String T, int next) int i= start, j=0, t=0; while(iS.length & jT.length) if(S.stri=T.strj) i+; j+; else if(j=0) i+; else j=nextj; t+; return t;(3)主函数#define MaxSize 80#include#include#include SString.h#includeBFandKMP.hint Replace(String S,int start,String T,String V) int i; Initiate(&S); Initiate(&T); I

温馨提示

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

最新文档

评论

0/150

提交评论