利用堆实现串的相关操作

学号 E22214006   专业 软件工程     姓名 郭晨坡

实验日期 2023.6.1      教师签字     成绩

实验报告三

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int next[30],nextval[30];

typedef int Status;

#define OK 1

#define ERROR 0

//串的堆分配存储表示

typedef struct  //参考书Pg. 75

{

char  *ch;//若串是非空,则按照串长分配存储区,否者ch为NULL

int length;//串长度

}HString;

Status StrAssign(HString &T,char * Str)

{//请补充你的代码:生成一个其值等于Str的串T

int len=strlen(Str);

T.ch =(char*)malloc(sizeof(char)*len);

int i;

strcpy(T.ch ,Str);

T.length =len;

return OK;

}

Status ClearString(HString &T)

{//请补充你的代码:将S清空为空串

T.length=0;

free(T.ch);

T.ch =NULL;

return OK;

}

Status Concat(HString &T, HString S1, HString S2)

{//请补充你的代码:用T返回S1和S2联接而成的新串

T.ch =(char*)malloc(sizeof(char)*(S1.length +S2.length ));

T.length =S1.length +S2.length ;

strcpy(T.ch ,S1.ch );

strcat(T.ch ,S2.ch );

return OK;

}

Status SubString(HString &Sub, HString S, int pos, int len)

{//请补充你的代码:用Sub返回串S的第pos个字符起长度为len的子串

Sub.ch =(char*)malloc(sizeof(char)*len );

for(int i=0;i<len;i++)

{

Sub.ch [i]=S.ch [pos+i-1];

}

Sub.length =len;

return OK;

}

void get_next(HString T,int next[])//求模式串T的next函数值并存入数组next中

{

int i=1,j=0;next[1]=0;

while(i<T.length)

{

if(j==0||T.ch [i-1]==T.ch[j-1])

{

++i;++j;

next[i]=j;

}

else

j=next[j];

}

}

void get_nextval(HString T,int next[],int nextval[])

//求模式串T的nextval函数值并存入数组nextval中

{

int i=1;

nextval[1]=0;

while(i<T.length )

{

if(T.ch[i]==T.ch [next[i+1]-1])

nextval[i+1]=nextval[next[i+1]];

else

nextval[i+1]=next[i+1];

i++;

}

}

Status Index_KMP(HString S, HString T, int pos)//主函数,参考课本 Pg 82

{//请补充你的代码: 实现KMP算法,返回子串T在主串S中第pos个字符之后的位置。

//若不存在,则函数值为0,其中,T非空,1<=pos<=StrLength(S)

int i=pos,j=1;

while(i<=S.length &&j<=T.length )

{

if(j==0||S.ch [i-1]==T.ch[j-1])

{

++i;++j;

}

else j=next[j];

}

if(j>T.length )

return i-T.length ;

else

return ERROR;

}

//主函数

int main(int argc,char* argv[])

{

char * str1="I am from Anhui University.";

char * str2="I am 20 years old!";

HString S1,S2,S3,Sub;

//请补充你的代码: 调用StrAssign(),用str1赋值给S1,str2赋值给S2,并且屏幕输出S1和S2 (S1:I am from Anhui University. S2: I am 20 years old! )

StrAssign(S1,str1);StrAssign(S2,str2);

printf("S1:%sS2:%s\n",S1.ch ,S2.ch );

//请补充你的代码:调用Concat(),联接S1和S2,生成S3,并且屏幕输出S3 (S3:I am from Anhui University. I am 20 years old!)

Concat(S3, S1, S2);

printf("S3:%s\n",S3.ch );

//请补充你的代码:调用SubString(Sub,S1,11,5),屏幕输出Sub (Sub: Anhui)

SubString(Sub,S1,11,5);

printf("Sub:%s\n",Sub.ch );

//请补充你的代码:调用Index_KMP(S3,Sub,1),屏幕输出Sub在S3出现的位置 (11)

get_next(Sub,next);

get_nextval(Sub,next,nextval);

printf("%d",Index_KMP(S3,Sub,1));

//请补充你的代码:调用ClearString,释放S1,S2,S3,Sub

ClearString(S1);

ClearString(S2);

ClearString(S3);

ClearString(Sub);

return 1;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我睁眼了呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值