统计子串出现次数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
1、问题描述
设计算法,计算一个子串在一个字符串中出现的次数,如果字符串中不存在该子串,计次数为0.
2、基本要求
(1)设计获取字符串及子串的方法。
(2)设计算法统计子串在字符串中出现的次数。
(3)输入:字符串与子串。
(4)输出:字符串、子串及子串在字符串中出现的次数。
3.数据结构设计
typedef struct
{
char *ch;
int length;
}hstring;
4.串的基本操作
status strassign(hstring *t,char *cha)//串分配函数
{
char *c;
int i,j;
for(i=0,c=cha;*c;++i,++c);
if(!i){t->ch=NULL;t->length=0;}
else
{
if(!(t->ch=(char*)malloc(i*sizeof(char)))) exit (0);
for(j=0;j
*(t->ch+j)= *(cha+j);
t->length=i;
}
return 1;
}
int strcompare(hstring *s,hstring *t)//串比较函数
{
int i;
for(i=0;i<(s->length)&&i<(t->length);++i)
if(s->ch[i]!=t->ch[i]) return s->ch[i]-t->ch[i];
return s->length-t->length;
}
status concat(hstring *t,hstring s1,hstring s2)//串连接函数
{
int i,j;
t->length=s1.length+s2.length;
if(!(t->ch=(char*)malloc(t->length*sizeof(char)))) exit (0);
for(i=0;i *(t->ch+i)=*(s1.ch+i); for(j=0;j *(t->ch+i+j)=*(s2.ch+j); return 1; } status substring(hstring *sub,hstring s,int pos,int len) //求子串{ int i; if(pos<1||pos>s.length||len<0||len>s.length-pos+1) { sub->length=0; sub->ch=NULL; return 0; } if(!len){sub->ch=NULL;sub->length=0;} else { if(!(sub->ch=(char*)malloc(len*sizeof(char)))) exit (0); for(i=0;i *(sub->ch+i)=*(s.ch+pos-1+i); sub->length=len; } return 1; } status printstring(hstring s) { int i; if(!s.ch) {printf("over the zone\n"); return 0;} for(i=0;i printf("%c",*(s.ch+i)); printf("\n"); return 1; } 5.求子串个数 status countstring(hstring s,hstring sd,int *sum) { int i,j; *sum=0; if((s.length-sd.length)<0) { printf("error\n"); return 0; } for(i=0;i<(s.length-sd.length+1);i++) { for(j=0;j if(*(s.ch+i+j)!=*(sd.ch+j))break; if(j==(sd.length)) { (*sum)++; } } return 1; } 6.实验结果 7.心得与体会 这个算法本身并不复杂,可是最后结果我的算法开销很大,占用了很大的cpu资源,运行起来很卡,应当继续改进算法。