数据结构实验报告串_第1页
数据结构实验报告串_第2页
数据结构实验报告串_第3页
数据结构实验报告串_第4页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验四串【实验目的】1、掌握串的存储表示及基本操作;2、掌握串的两种模式匹配算法:BF 和 KMP。3、了解串的应用。【实验学时】2 学时【实验预习】回答以下问题:1、串和子串的定义串的定义:串是由零个或多个任意字符组成的有限序列。子串的定义:串中任意连续字符组成的子序列称为该串的子串。2、串的模式匹配串的模式匹配即子串定位是一种重要的串运算。设s 和 t 是给定的两个串,从主串s的第 start个字符开始查找等于子串t 的过程称为模式匹配, 如果在 S 中找到等于t 的子串,则称匹配成功,函数返回t 在 s 中首次出现的存储位置(或序号);否则,匹配失败,返回0。【实验容和要求】1、按照要求

2、完成程序exp4_1.c ,实现串的相关操作。调试并运行如下测试数据给出运行结果:求“ This is a boy”的串长;比较” abc3”和“ abcde “; 表示空格比较” english”和“ student “;比较” abc ”和“ abc “;截取串” white ”,起始2,长度 2;截取串” white ”,起始1,长度 7;截取串” white ”,起始6,长度 2;连接串” asddffgh ”和” 12344”;#include<stdio.h>#include<string.h>#define MAXSIZE 100#define ERROR

3、 0#define OK 1/* 串的定长顺序存储表示 typedef struct */char dataMAXSIZE;int length; SqString;int strInit(SqString *s);/*int strCreate(SqString *s);/*int strLength(SqString *s);/*intstrCompare(SqString*s1,SqString*s2);int subString(SqString *sub,SqString *s,int pos,int len);int strConcat(SqString *t,SqString *

4、s1,SqString *s2);/*/*/*初始化串 */生成一个串 */求串的长度 */两个串的比较*/求子串 */两个串的连接*/* 初始化串 */int strInit(SqString *s)s->length=0;s->data0='0'return OK;/*strInit*/* 生成一个串 */int strCreate(SqString *s)printf("input string :");gets(s->data);s->length=strlen(s->data);return OK;/*strCreat

5、e*/* ( 1) - 求串的长度 */int strLength(SqString *s)return s->length;/*strLength*/* ( 2) - 两个串的比较, S1>S2 返回 >0, s1<s2 返回 <0, s1=s2 返回 0*/ int strCompare(SqString *s1,SqString *s2) int i;for(i=0;i<s1->length&&i<s2->length;i+)if(s1->datai>s2->datai)return 1;if(s1-

6、>datai<s2->datai)return -1;return 0;/*strCompare*/* ( 3) - 求子串, sub 为返回的子串, pos 为子串的起始位置, len 为子串的长度 */ int subString(SqString *sub,SqString *s,int pos,int len)int i;if(pos<1|pos>s->length|len<0|len>s->length-pos+1)return ERROR;sub->length=0;for(i=0;i<len;i+)sub->

7、datai=s->datai+pos-1;sub->length+;sub->datai='0'return OK;/*subString*/* ( 4) - 两个串连接, s2 连接在 s1 后,连接后的结果串放在 t 中 */ int strConcat(SqString *t,SqString *s1,SqString *s2) int i=0,j=0;while(i<s1->length)t->datai=s1->datai;i+;while(j<s2->length)t->datai+=s2->data

8、j+;t->datai='0't->length=s1->length+s2->length;return OK;/*strConcat*/int main()int n,k,pos,len;SqString s,t,x;doprintf("n -String- n");printf(" 1. strLentghn");printf(" 2. strComparen");printf(" 3. subStringn");printf(" 4. strConcatn&

9、quot;);printf(" 0. EXITn");printf("n -String-n");printf("ninput choice:");scanf("%d",&n);getchar();switch(n)case 1:printf("n*show strLength*n");strCreate(&s);printf("strLength is %dn",strLength(&s);break;case 2:printf("n*sh

10、ow strCompare*n");strCreate(&s);strCreate(&t);k=strCompare(&s,&t); /* (5) - 调用串比较函数比较 s, t*/ if(k=0)printf("two string equal!n");else if(k<0)printf("first string<second string!n");elseprintf("first string>second string!n");break;case 3:prin

11、tf("n*show subString*n");strCreate(&s);printf("input substring pos,len:");scanf("%d,%d",&pos,&len);if(subString(&t,&s,pos,len)printf("subString is %sn",t.data);elseprintf("pos or len ERROR!n");break;case 4:printf("n*show subC

12、oncat*n");strCreate(&s);strCreate(&t);if(strConcat(&x,&s,&t) /* ( 6) - 调用串连接函数连接 s&t*/ printf("Concat string is %s",x.data);elseprintf("Concat ERROR!n");break;case 0:exit(0);default:break;while(n);return 0;2 、按照要求完成程序exp4_2.c ,实现 BF&KMP串的模式匹配算法。调试

13、及测试数据并给出结果:应用 BF 算法求子串” JING”在主串” BEIJING”中的位置, 测试起始位置分别为 1 和 5 的情况;应用 KMP算法求子串” abaabcac ”在主串” acabaabaabcacaabc ”中的位置, 测试起始位置分别为 1, 10 的情况,并写出子串的 next 值;exp4_2.c 部分代码如下:#include<stdio.h>#include<string.h>#define MAXSIZE 100#define ERROR 0#define OK 1/* 串的定长顺序存储表示*/typedef structchar da

14、taMAXSIZE;int length; SqString;int strCreate(SqString *s);int indexBf(SqString *s,SqString *t,int pos);/*void getNext(SqString *t,int next);/*KMPint indexKmp(SqString *s,SqString *t,int start,int next); /*串的模式匹配求 nextBF*/值 */串的模式匹配KMP*/* 生成一个串 */int strCreate(SqString *s)printf("input string :&

15、quot;);gets(s->data);s->length=strlen(s->data);return OK;/*strCreate*/* ( 1) - 串的模式匹配BF*/int indexBf(SqString *s,SqString *t,int pos)int i=pos-1,j=0;while(i<s->length&&j<t->length)if(s->datai=t->dataj)i+;j+;elsei=i-j+1;j=0;if(j>=t->length)return i-t->lengt

16、h+1;elsereturn 0;/*index_bf*/* ( 2) -KMP 求 next 值*/void getNext(SqString *t,int next)int i=0,j=-1;next0=-1;while(i<t->length)if(j=-1)|(t->datai=t->dataj)j+;i+;nexti=j;elsej=nextj;/*getNext*/* ( 3) -KMP 模式匹配 */int indexKmp(SqString *s,SqString *t,int start,int next)int i=start-1,j=0;while

17、(i<s->length&&j<t->length)if(j=-1|s->datai=t->dataj)i+;j+;elsej=nextj;if(j>=t->length)return i-t->length+1;elsereturn 0;/*index_kmp*/int main()int n,i,pos,nextMAXSIZE;SqString s,t;doprintf("n -String- n");printf(" 1. Index_BFn");printf(" 2.

18、 INdex_KMPn");printf(" 0. EXITn");printf("n -String-n");printf("ninput choice:");scanf("%d",&n);getchar();switch(n)case 1:printf("n*show Index_BF*n");printf(" s:");strCreate(&s);printf(" t:");strCreate(&t);printf("input st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论