数据结构串的应用.docx
- 文档编号:6880698
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:14
- 大小:97.83KB
数据结构串的应用.docx
《数据结构串的应用.docx》由会员分享,可在线阅读,更多相关《数据结构串的应用.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构串的应用
信息工程大学数据结构实验(实习)报告
实验(实习)名称串的应用实验(实习)日期2015-11-2得分指导教师顾韵华
系计软院专业计科年级2014级班次2
一、实验目的
1、掌握串的用法。
二、实验容
1、设计一个算法,删去串s中从第i个字符开始的连续j个字符(以堆分配法表示串)。
2、若x和y是两个以堆分配法表示的串,请设计一个算法,找出x中第一个不在y中出现的字符。
3.一个文本串可用事先给定的字母映射表进行加密。
例如,设字母映射表为:
a
b
c
d
e
f
g
h
i
j
n
g
z
q
t
c
o
b
m
u
k
l
m
n
o
p
q
r
s
t
h
e
l
k
p
d
a
w
x
f
u
v
w
x
y
z
y
i
v
r
s
j
则字符串'encrypt'被加密为'tkzwsdf'。
(1)写一算法将输入的文本串进行加密后输出;
(2)写一算法,将输入的已加密文本串进行解密后输出。
4、实现朴素的模式匹配算法。
三、
//设计一个算法,删去串s中从第i个字符开始的连续j个字符(以堆分配法表示串)。
#include
#include
#include
#defineOK1
#defineERROR0
typedefintStatus;
typedefstruct{//堆分配法表示串的类型定义
char*ch;//存储区基址
intlength;//串长
}HString;
StatusstrAssign(HString&S,char*chars)
//生成一个其值等于串常量chars的串S
{
inti,j;
char*c;
if(S.ch)free(S.ch);
for(i=0,c=chars;*c!
='\0';i++,c++);//求串chars的长度,存于i
if(!
i)//chars为空串
{S.ch=NULL;S.length=0;}
else
{if(!
(S.ch=(char*)malloc(i*sizeof(char))))
returnERROR;
for(j=0;j
S.length=i;
}
returnOK;
}
StatusstrDelete(HString&S,inti,intj)
//删除串S中从i开始的j个字符,串采用堆分配法存储
{
intk,m;
if(i>S.length||i<1)
returnERROR;
for(k=i+j-1,m=i-1;k S.ch[m]=S.ch[k]; S.ch[m+1]='\0'; S.length=S.length-j; returnOK; } voidprintString(HStringS) { inti; for(i=0;i printf("%c",S.ch[i]); printf("\n"); } /*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/ intmain() { HStringS; charstr[]="Thisisateststring! "; printf("创建字符串S! \n"); if(strAssign(S,str)==ERROR) { printf("创建的字符串S失败! \n"); return1; } printf("创建的字符串S为: "); printString(S); printf("删除字符串S从3开始的4个字符: \n"); strDelete(S,3,4); printf("删除字符后的字符串S为: \n"); printString(S); return0; } 2、//若x和y是两个以堆分配法表示的串,请设计一个算法,找出x中第一个不在y中出现的字符 #include #include #include #include #defineOK1 #defineERROR0 #defineOVERFLOW-1 typedefintStatus; typedefstruct{//堆分配法表示串的类型定义 char*ch;//存储区基址 intlength;//串长 }HString; StatusstrAssign(HString&S,char*chars) {//生成一个其值等于串常量chars的串T inti,j; char*c; if(S.ch)free(S.ch); for(i=0,c=chars;*c;i++,c++);//求串chars的长度,存于i if(! i)//ars为空串 {S.ch=NULL;S.length=0;} else {if(! (S.ch=(char*)malloc(i*sizeof(char)))) exit(OVERFLOW); for(j=0;j S.length=i; } returnOK; } voidstrSearch(HString&S1,HString&S2) { inti,j; for(i=0;i { intm=0; for(j=0;j { if(S1.ch[i]==S2.ch[j]) break; else m++; } if(m==S2.length) gotol; } l: printf("%c\n",S1.ch[i]); } intmain() { HStringS1,S2; charstr1[100],str2[100]; printf("输入串X: "); gets(str1); printf("输入串Y: "); gets(str2); S1.ch=NULL;S2.ch=NULL; strAssign(S1,str1);strAssign(S2,str2); strSearch(S1,S2); return0; } 3、//一个文本串可用事先给定的字母映射表进行加密 #include #include #include #defineOK1//定义常量 #defineERROR0 typedefintStatus; typedefstruct{//堆分配法表示串的类型定义 char*ch;//存储区基址 intlength;//串长 }HString; StatusStrLength(HStrings)//求串长 { returns.length; } StatusstrAssign(HString&S,char*chars) //生成一个其值等于串常量chars的串S { inti,j; char*c; //if(S.ch)free(S.ch); for(i=0,c=chars;*c! ='\0';i++,c++);//求串chars的长度,存于i if(! i)//chars为空串 {S.ch=NULL;S.length=0;} else {if(! (S.ch=(char*)malloc(i*sizeof(char)))) returnERROR; for(j=0;j S.length=i; } returnOK; } voidstrencrypt(HString&s)//将输入的字符串加密后输出 { inti=0; intn; n=StrLength(s); while(i<=n) { switch(s.ch[i]) { case'a': s.ch[i]='n';break; case'b': s.ch[i]='g';break; case'c': s.ch[i]='z';break; case'd': s.ch[i]='q';break; case'e': s.ch[i]='t';break; case'f': s.ch[i]='c';break; case'g': s.ch[i]='o';break; case'h': s.ch[i]='b';break; case'i': s.ch[i]='m';break; case'j': s.ch[i]='u';break; case'k': s.ch[i]='h';break; case'l': s.ch[i]='e';break; case'm': s.ch[i]='l';break; case'n': s.ch[i]='k';break; case'o': s.ch[i]='p';break; case'p': s.ch[i]='d';break; case'q': s.ch[i]='a';break; case'r': s.ch[i]='w';break; case's': s.ch[i]='x';break; case't': s.ch[i]='f';break; case'u': s.ch[i]='y';break; case'v': s.ch[i]='i';break; case'w': s.ch[i]='v';break; case'x': s.ch[i]='r';break; case'y': s.ch[i]='s';break; case'z': s.ch[i]='j';break; } i++; } for(i=0;i<=n;i++) printf("%c",s.ch[i]); printf("\n"); } voidinstrencrypt(HString&s)//将输入的字符串解密后输出 { inti=0; intn; n=StrLength(s); while(i<=n) { switch(s.ch[i]) { case'n': s.ch[i]='a';break; case'g': s.ch[i]='b';break; case'z': s.ch[i]='c';break; case'q': s.ch[i]='d';break; case't': s.ch[i]='e';break; case'c': s.ch[i]='f';break; case'o': s.ch[i]='g';break; case'b': s.ch[i]='h';break; case'm': s.ch[i]='i';break; case'u': s.ch[i]='j';break; case'h': s.ch[i]='k';break; case'e': s.ch[i]='l';break; case'l': s.ch[i]='m';break; case'k': s.ch[i]='n';break; case'p': s.ch[i]='o';break; case'd': s.ch[i]='p';break; case'a': s.ch[i]='q';break; case'w': s.ch[i]='r';break; case'x': s.ch[i]='s';break; case'f': s.ch[i]='t';break; case'y': s.ch[i]='u';break; case'i': s.ch[i]='v';break; case'v': s.ch[i]='w';break; case'r': s.ch[i]='x';break; case's': s.ch[i]='y';break; case'j': s.ch[i]='z';break; } i++; } for(i=0;i<=n;i++) printf("%c",s.ch[i]); printf("\n"); } intmain() { HStrings,t; charstr1[100]; charstr2[100]; printf("请输入未加密的字符串: "); gets(str1); strAssign(s,str1); printf("加密后的字符串为: "); strencrypt(s); printf("请输入加密的字符串: "); gets(str2); strAssign(t,str2); printf("解密后的字符串为: "); instrencrypt(t); return0; } 4、朴素模式的匹配 #include //朴素的模式匹配 #include #include #include #defineOK1 #defineERROR0 typedefintStatus; typedefunsignedcharHString[100]; StatusstrAssign(HString&S,char*chars) //生成一个其值等于串常量chars的串S { inti,j; char*c; for(i=0,c=chars;*c! ='\0';++i,++c);//求串chars的长度,存于i if(! i)//chars为空串 S[0]=0; else { for(j=0;j S[j+1]=chars[j]; S[0]=i; } returnOK; } StatusIndex(HStringS,HStringT,intpos)//返回子串T在主串S中第Pos个字符之后的位置 { inti=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]) returni-T[0]; else return0; } intmain() { HStrings,t; charstr1[100],str2[100]; intn,k; printf("请输入主串: "); gets(str1); printf("请输入子串: "); gets(str2); printf("请输入位置: "); scanf("%d",&n); strAssign(s,str1); strAssign(t,str2); k=Index(s,t,n); printf("%d\n",k); return0; } 四、程序调试 1、操作结果: 2、若x和y是两个以堆分配法表示的串,请设计一个算法,找出x中第一个不在y中出现的字符 3、操作结果: 4、操作结果 五、实验总结 通过这次实验,我掌握了串的用法,在做第一个实验时我不怎么会用串,在老师的帮助下我慢慢理解了,然后照着老师的指导做了第二题,做加密解密的时候,我最开始就想到了用switch判断字符然后把对应的字符换掉,但总是出现分配错误,于是我把strAssign函数重新写了,结果正确了。 做第四题匹配模式的时候我参考了书上的程序,可发现书上用的是数组,我又把相关语句改成串,可最后不能运行,我最终也没有找到原因,希望老师可以解答一下。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 应用