统计子串出现次数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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资源,运行起来很卡,应当继续改进算法。

相关文档
最新文档