1、数据结构实验4顺序串和链串的实现数据结构课程实验报告实验名称顺序串和链串的实现实验序号4实验日期2012-5-2姓 名曹志华院系计算机科学与信息工程学院班 级10104115学 号1010411501专 业计算机科学与技术指导教师武伟成 绩教师评语一、实验目的和要求1.理解串和一般线性表之间的差异;2.重点理解在顺序串上和链串上实现串的基本运算算法;3.掌握串的简单匹配算法和KMP算法;4.灵活运算串这种数据结构解决一些基本问题。二、实验项目摘要实验1:编写一个程序,实现顺序串的各种基本算法,并在此基础上设计一个主程序完成如下功能:1.建立串s=“abcdefghefghijklmn”和串s1
2、=“xyz” 2 输出串s 3 输出串s的长度 4 在串s的第9个字符位置插入串s1而产生c串s2 5 输出串s2 6 删除串s第2个字符开始的5个字符替换成串s2 7 输出串s2 8 将串s的第2个字符开始的5个字符替换成串s1而产生串s2 9 输出串s2 10提取串s的第2个字符开始的10个字符而产生串s3 11输出串s3 12将串s1和串s2连接起来而产生串s4 13输出串s4实验2:编写一个程序,实现链串的各种基本算法,并在此基础上设计一个主程序完成如下功能:1.建立串s=“abcdefghefghijklmn”和串s1=“xyz” 2 输出串s 3 输出串s的长度 4 在串s的第9个
3、字符位置插入串s1而产生c串s2 5 输出串s2 6 删除串s第2个字符开始的5个字符替换成串s2 7 输出串s2 8 将串s的第2个字符开始的5个字符替换成串s1而产生串s2 9 输出串s2 10提取串s的第2个字符开始的10个字符而产生串s3 11输出串s3 12将串s1和串s2连接起来而产生串s4 13输出串s4三、实验预习内容1.首先掌握串的基本概念:串是由零个或多个字符组成的有限序列;2.灵活掌握串的存储结构3.掌握串的顺序存储结构和链式存储结构串赋值运算算法串复制运算算法求串长运算算法判断串相等运算算法串连接运算算法求子串运算算法查找子串位置运算算法子串插入运算算法子串删除运算算法
4、子串替换运算算法输出串运算算法4. 理解串的模式匹配 三、实验结果与分析实验结果:实验1:实验2:实验分析: 通过本次试验,我了解并掌握了串的基础知识,并利用串的顺序存储结构和链式存储结构,编写了两个程序,串是一种线性结构,是由零个或多个字符组成的优先序列,串的处理在计算机非数值处理中占有重要的地位,如信息检索系统、文字编辑等都以串作为处理对象。所以串很重要。在今后的学习中我会多加练习,更熟练的掌握串的应用。源代码: 实验1:#include#include#define MaxSize 1024 typedef char ElemType;typedef struct char data M
5、axSize; int length ;SqString;/建立串s void StrAssign(SqString &s,char cstr) /串的赋值(s为引用型参数) int i; for(i=0;cstri!=0;i+) s.datai=cstri; s.length=i; /串长运算 int StrLength(SqString s) return(s.length); /子串插入 SqString InsStr(SqString s1,int i,SqString s2) int j; SqString str; str.length=0; if(is1.length+1) /参
6、数不正常时返回空串 return str; for(j=0;ji-1;j+)/将s1.data【0.。i-2】复制到str str.dataj=s1.dataj; for(j=0;js2.length;j+)/将s2.data【0.。s2.length-1】复制到str str.datai+j-1=s2.dataj; for(j=i-1;js1.length;j+)/将s1.data【i-1.s1.length-1】复制到str str.datas2.length+j=s1.dataj ; str.length=s1.length+s2.length; return str; /删除串 SqS
7、tring DelStr(SqString s,int i,int j) int k; SqString str; str.length=0; if(is.length|i+js.length+1)/参数不正常时返回空串 return str; for(k=0;ki-1;k+)/将s.data【0.。i-2】复制到str str.datak=s.datak; for(k=i+j-1;ks.length;k+)/将s.data【i+j-1.s.length-1】复制到str str.datak-j=s.datak; str.length=s.length-j; return str; /子串替换
8、 SqString RepStr(SqString s,int i,int j,SqString t) int k; SqString str; if(is.length|i+js.length)/参数不正常时返回空串 return str; for(k=0;ki-1;k+)/将s.data【0.。i-2】复制到str str.datak=s.datak; for(k=0;kt.length;k+)/将t.data【0.。t.length】复制到str str.datai+k-1=t.datak; for(k=i+j-1;ks.length;k+)/将s.data【i+j-1.s.length
9、-1】复制到str str.datak-j=s.datak; str.length=s.length-j+t.length; return str; /提取串-求子串 SqString SuStr(SqString s,int i,int j) SqString str; int k; str.length=0; if(is.length|js.length) return str;/参数不正常时返回空串 for(k=i-1;ki+j-1;k+)/将s.data【i.i+j】复制到str str.datak-i+1=s.datak; str.length=j; return str; /串连接
10、 SqString Concat(SqString s,SqString t) SqString str; int i; str.length=s.length+t.length; for(i=0;is.length;i+) str.datai=s.datai; for(i=0;i0) for(i=0;is.length;i+) printf(%c,s.datai); printf(n); /主函数 void main() SqString s,s1,s2,s3,s4; printf(1.建立串s=abcdefghefghijklmn和串s1=xyz); printf(n); StrAssig
11、n(s,abcdefghijklmn); StrAssign(s1,xyz); printf(n); printf(2.输出串s);DisStr(s); printf(n); printf(3.输出串s的长度:%dn,StrLength(s); printf(n); printf(4.在串s的第9个字符位置插入串s1而产生c串s2n); s2=InsStr(s,9,s1); printf(n); printf(5.输出s2:); DisStr(s2); printf(nn); printf(6.删除串s第2个字符开始的5个字符替换成串s2n); s2=DelStr(s,2,5); printf
12、(n); printf(7.输出串s2:);DisStr(s2); printf(n); printf(8.将串s的第2个字符开始的5个字符替换成串s1而产生串s2n); s2=RepStr(s,2,5,s1); printf(n); printf(9.输出串s2:);DisStr(s2); printf(n); printf(10.提取串s的第2个字符开始的10个字符而产生串s3n); s3=SuStr(s,2,10); printf(n); printf(11. 输出串s3:);DisStr(s2); printf(n); printf(12.将串s1和串s2连接起来而产生串s4n); s
13、4=Concat(s1,s2); printf(n); printf(13.输出串s4:);DisStr(s2); printf(n); 实验2:#include#include#define MaxSize 1024 typedef char ElemType;typedef struct snode char data ; struct snode *next ;LiString;/建立串-赋值void StrAssign(LiString *&s,char cstr) int i; LiString *r,*p; s=(LiString *)malloc(sizeof(LiString)
14、; r=s; for(i=0;cstri!=0;i+) p=(LiString *)malloc(sizeof(LiString); p-data=cstri; r-next=p;r=p; r-next=NULL; /串长运算 int StrLength(LiString *s) int i=0; LiString *p=s-next; while(p!=NULL) i+; p=p-next; return i; /子串插入 LiString *InsStr(LiString *s,int i,LiString *t) int k; LiString *str,*p=s-next,*p1=t-
15、next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)+1) return str; for(k=1;kdata=p-data; r-next=q;r=q; p=p-next; while(p1!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p1-data; r-next=q;r=q; p1=p1-next; while(p!=NULL) q=(LiString *)malloc(sizeof(LiStrin
16、g); q-data=p-data; r-next=q;r=q; p=p-next; r-next=NULL; return str; /删除串 LiString *DelStr(LiString *s,int i,int j) int k=0; LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)|j0) return str; for(k=1;kdata=p-data; r-next=q;r=q; p=p-next; for
17、(k=0;knext; while(p!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p-data; r-next=q;r=q; p=p-next; r-next=NULL; return str; /子串替换 LiString *RepStr(LiString *s,int i,int j,LiString *t) int k; LiString *str,*p=s-next,*p1=t-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); r=str; if(iStrLength
18、(s)|jStrLength(s) return str; for(k=0;kdata=p-data;q-next=NULL; r-next=q;r=q; p=p-next; for(k=0;knext; while(p1!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p1-data;q-next=NULL; r-next=q;r=q; p1=p1-next; while(p!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p-data;q-next=NULL; r-next=
19、q;r=q; p=p-next; r-next=NULL; return str; /提取串-求子串 LiString *SuStr(LiString *s,int i,int j) int k=0; LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)|jStrLength(s) return str; for(k=0;kdata=p-data; r-next=q;r=q; p=p-next; r-next=NULL; ret
20、urn str; /串连接 LiString *Concat(LiString *s,LiString *t) LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); r=str; while(p!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p-data; r-next=q;r=q; p=p-next; p=t-next; while(p!=NULL) q=(LiString *)malloc(sizeof(LiString); q-data=p
21、-data; r-next=q;r=q; p=p-next; r-next=NULL; return str; /输出串 int DisStr(LiString *s) LiString *p=s-next; while(p!=NULL) printf(%c,p-data); p=p-next; printf(n); /主函数 void main() LiString *s,*s1,*s2,*s3,*s4; printf(1.建立串s=abcdefghefghijklmn和串s1=xyz); printf(n); StrAssign(s,abcdefghijklmn); StrAssign(s
22、1,xyz); printf(n); printf(2.输出串s);DisStr(s); printf(n); printf(3.输出串s的长度:%dn,StrLength(s); printf(n); printf(4.在串s的第9个字符位置插入串s1而产生c串s2n); s2=InsStr(s,9,s1); printf(n); printf(5.输出s2:); DisStr(s2); printf(nn); printf(6.删除串s第2个字符开始的5个字符替换成串s2n); s2=DelStr(s,2,5); printf(n); printf(7.输出串s2:);DisStr(s2)
23、; printf(n); printf(8.将串s的第2个字符开始的5个字符替换成串s1而产生串s2n); s2=RepStr(s,2,5,s1); printf(n); printf(9.输出串s2:);DisStr(s2); printf(n); printf(10.提取串s的第2个字符开始的10个字符而产生串s3n); s3=SuStr(s,2,10); printf(n); printf(11. 输出串s3:);DisStr(s2); printf(n); printf(12.将串s1和串s2连接起来而产生串s4n); s4=Concat(s1,s2); printf(n); printf(13.输出串s4:);DisStr(s2); printf(n); 注:空间不够,可以增加页码。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1