1、第四章 串数据结构基本实验算法实验 1 实现顺序串各种基本运算的算法#include#define MaxSize 100 /最多的字符个数typedef struct char dataMaxSize;/定义可以容纳MaxSize个字符的空间 int length; /标记当前实际串长SqString;void StrAssign(SqString &str,char cstr)/由串常量cstr创建str int i; for(i=0;cstri!=0;i+) str.datai=cstri; str.length=i;void StrCopy(SqString &s,SqString t
2、)/将串t复制到串s int i; for(i=0;it.length;i+) s.datai=t.datai; s.length=t.length;int StrEqual(SqString s,SqString t)/判断两个串s和t是否相同 int same=1,i; if(s.length!=t.length) /长度不相等时返回 same=0; else for(i=0;is.length;i+) if(s.datai!=t.datai)/有一个对应字符不相同时返回 same=0; return same;int StrLength(SqString s) /求串s的长度 retur
3、n s.length;SqString Concat(SqString s,SqString t)/将串t连接到串s之后产生新串 SqString str; int i; str.length=s.length+t.length; for(i=0;is.length;i+) /将s.data0.s.length-1复制到str str.datai=s.datai; for(i=0;it.length;i+) /将t.data0.t.length-1复制到str str.datas.length+i=t.datai; return str;SqString SubStr(SqString s,i
4、nt i,int j)/由串s的第i个字符开始的的j个字符产生新串 SqString str; int k; str.length=0; if(is.length|js.length) printf(参数不正确n); return str; /参数不正确,返回空串 for(k=i-1;ki+j-1;k+) /将s.datai.i+j复制到str str.datak-i+1=s.datak; str.length=j; return str;SqString InsStr(SqString s1,int i,SqString s2)/将串s2插入到串s1的第i个位置处 int j; SqStri
5、ng str; str.length=0; if(is1.length+1)/参数不正确时返回空串 printf(参数不正确n); return s1; for(j=0;ji-1;j+) /将s1.data0.i-2复制到str str.dataj=s1.dataj; for(j=0;js2.length;j+)/将s2.data0.s2.length-1复制到str str.datai+j-1=s2.dataj; for(j=i-1;js1.length;j+)/将s1.datai-1.s1.length-1复制到str str.datas2.length+j=s1.dataj; str.l
6、ength=s1.length+s2.length; return str;SqString DelStr(SqString s,int i,int j)/删除串s的第i个字符开始的j个字符产生新串 int k; SqString str; str.length=0; if(is.length|i+js.length+1)/参数不正确时返回空串 printf(参数不正确n); return str; for(k=0;ki-1;k+) /将s.data0.i-2复制到str str.datak=s.datak; for(k=i+j-1;ks.length;k+)/将s.datai+j-1.s.l
7、ength-1 str.datak-j=s.datak; str.length=s.length-j; return str;SqString RepStr(SqString s,int i,int j, SqString t)/将串s的第i个字符开始的j个字符替换成串t产生新串 int k; SqString str; str.length=0; if(is.length|i+j-1s.length)/参数不正确时返回空串 printf(参数不正确n); return str; for(k=0;ki-1;k+) /将s.data0.i-2复制到str str.datak=s.datak; f
8、or(k=0;kt.length;k+) str.datai+k-1=t.datak; for(k=i+j-1;k0) for(i=0;is.length;i+) printf(%c,s.datai); printf(n); /主程序void main() SqString s,s1,s2,s3,s4; printf(1)建立串s和串s1n); StrAssign(s,abcdefghijklmn); StrAssign(s1,xyz); printf(2)输出串s:); DispStr(s); printf(3)串s的长度:%dn,StrLength(s); printf(4)在串的第九个字
9、符位置插入串s1而产生串s2n); s2=InsStr(s,9,s1); printf(5)输出串s2:); DispStr(s2); printf(6)删除串s第二个字符开始的个字符而产生串s2n); s2=DelStr(s,2,3); printf(7)输出串s2:);DispStr(s2); printf(8)将串s第二个字符开始的个字符替换成串s1而产生串s2n); s2=RepStr(s,2,5,s1); printf(9)输出串s2:); DispStr(s2); printf(10)提取串s的第二个字符开始的个字符而产生串s3n); s3=SubStr(s,2,10); prin
10、tf(11)输出串s3:); DispStr(s3); printf(12)将串s1和串s2连接起来而产生串s4n); s4=Concat(s1,s2); printf(13)输出串s4:); DispStr(s4);/ 实验 2 实现链串各种基本运算的算法#include#includetypedef struct snode char data; struct snode *next;LiString;void StrAssign(LiString *&s,char t) int i; LiString *r,*p; s=(LiString *)malloc(sizeof(LiString
11、); s-next=NULL; r=s; for(i=0;ti!=0;i+) p=(LiString *)malloc(sizeof(LiString); p-data=ti; p-next=NULL; r-next=p; r=p; void StrCopy(LiString *&s,LiString *t) LiString *p=t-next,*q,*r; s=(LiString *)malloc(sizeof(LiString); s-next=NULL; r=s; while(p!=NULL) /将t的所有节点复制到s q=(LiString *)malloc(sizeof(LiStr
12、ing); q-data=p-data; q-next=NULL; r-next=q; r=q; p=p-next; int StrEqual(LiString *s,LiString *t) LiString *p=s-next,*q=t-next; while(p!=NULL&q!=NULL&p-data=q-data) p=p-next; q=q-next; if(p=NULL&q=NULL) return 1; else return 0;int StrLength(LiString *s) int i=0; LiString *p=s-next; while(p!=NULL) i+;
13、 p=p-next; return i;LiString *Concat(LiString *s,LiString *t) LiString *str,*p=s-next,*q ,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; while(p!=NULL)/将s的所有节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p-data; q-next=NULL; r-next=q; r=q; p=p-next; p=t-next; while(p!=NUL
14、L)/将t的所有节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p-data; q-next=NULL; r-next=q; r=q; p=p-next; return str;LiString *SubStr(LiString *s,int i,int j) int k; LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)|jStrLength(s) printf
15、(参数不正确n); return str; /参数不正确是返回空串 for(k=0;knext; for(k=1;kdata=p-data; q-next=NULL; r-next=q; r=q; p=p-next; return str;LiString *InsStr(LiString *s,int i,LiString *t) int k; LiString *str,*p=s-next,*p1=t-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)+1)
16、printf(参数不正确n); return str; for(k=1;kdata=p-data; q-next=NULL; r-next=q; r=q; p=p-next; while(p1!=NULL) /将t的所有节点复制到str q=(LiString *)malloc(sizeof (LiString); q-data=p1-data; q-next=NULL; r-next=q; r=q; p1=p1-next; while(p!=NULL)/将*p及其后的节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p-data;
17、q-next=NULL; r-next=q; r=q; p=p-next; return str;LiString *DelStr(LiString *s,int i,int j) int k; LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString); str-next=NULL; r=str; if(iStrLength(s)|jStrLength(s) printf(参数不正确n); return str; for(k=0;kdata=p-data; q-next=NULL; r-next=q; r=q;
18、 p=p-next; for(k=0;knext; while(p!=NULL)/将*p及其后的节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p-data; q-next=NULL; r-next=q; r=q; p=p-next; 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(LiStrin
19、g); str-next=NULL; r=str; if(iStrLength(s)|jStrLength(s) printf(参数不正确n); 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)/将t的所有节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p1-data; q-next=NULL; r-next=q; r=q; p1=p1-next; while(p!=NULL)/
20、将*p及其后的节点复制到str q=(LiString *)malloc(sizeof(LiString); q-data=p-data; q-next=NULL; r-next=q; r=q; p=p-next; return str;void DispStr(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和串s1n); StrAssign(s,abc
21、defghijklmn); StrAssign(s1,xyz); printf(2)输出串s:);DispStr(s); printf(3)串s的长度:%dn,StrLength(s); printf(4)在串s的第九个字符位置插入串s1而产生串s2n); s2=InsStr(s,9,s1); printf(5)输出串s2:);DispStr(s2); printf(6)删除串s第二个字符开始的五个字符而产生串s2n); s2=DelStr(s,2,3); printf(7)输出串s2:);DispStr(s2); printf(8)将串s第二个字符开始的五个字符替换成串s1而产生串s2n);
22、 s2=RepStr(s,2,5,s1); printf(9)输出串s2:);DispStr(s2); printf(10)提取串s的第二个字符开始的十个字符而产生串s3n); s3=SubStr(s,2,10); printf(11)输出串s3:);DispStr(s3); printf(12)将串s1和串s2连接起来而产生串s4n); s4=Concat(s1,s2); printf(13)输出串s4:);DispStr(s4);/实验 3 顺序串的各种模式匹配运算编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上完成如下功能:(1) 建立“abcabcdabcdeabcdefabc
23、defg”目标串s和“abcdeabcdefab”模式串t。(2) 采用简单匹配算法求t在s中的位置。(3) 由模式串t求出next值和nextval值。(4) 采用KMP算法求出t在s中的位置。(5) 采用改进的KMP算法求出t在s中的位置。#include#include#define MaxSize 100typedef struct char dataMaxSize;/定义可容纳MaxSize个字符空间 int length; /标记当前实际串长SqString;void StrAssign(SqString &str,char cstr) int i; for(i=0;cstri!=
24、0;i+) str.datai=cstri; str.length=i;void DispStr(SqString s) int i; if(s.length0) for(i=0;is.length;i+) printf(%c,s.datai); printf(n); int Index(SqString s,SqString t)/简单匹配算法 int i=0,j=0,k; while(is.length&j=t.length) k=i-t.length; /返回匹配的第一个字符的下标 else k=-1; /模式匹配不成功 return k;void GetNext(SqString t,int next)/由模式串t求出next值 int j,k; j=0;k=-1;next0=-1; while(jt.length-1) if(k=-1|t.dataj=t.dat
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1