文章导航
大二上数据结构实验1内容,使用C语言实现串的模式匹配
一、实验题目和要求
基于串的模式匹配
(一)实验目的:
通过本次实验,熟练掌握抽象数据类型串的实现,学会使用串及其模式匹配算法解决具体应用问题,从而体会串的特点。
(二)基本要求:
1)将HTML文件按字符顺序读入;
2)基于串的模式匹配算法,设计HTML文件中的信息提取方法,识别HTML文件中每条发帖的发信人ID、发帖时间和发帖IP;
3)在屏幕输出识别得到的每条发帖的发信人ID、发帖时间和发帖IP。
(三)内容提要:
1)用KMP算法实现模式匹配;
2)提示:在文件中,每条发帖的发信人ID之前紧邻的字符串均为“发信人:”、之后均为“(”,发帖时间和发帖IP也有类似的规律。
(四)示例
上图为所提供的HTML文件部分区域截图,其中发信人ID为“Dabo”、发帖时间为“Wed Sep 13 13:15:37 2017”、发帖IP为“202.117.62.94”。
二、按不同功能分析各程序模块
(一)包含库函数、定义常量、变量类型
1 2 3 4 5 6 7
| #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include <afxinet.h> #define MAXSTRLEN 10000 #define MAXNEXTLEN 15
|
(二)数据结构基础定义(串)、next数组定义
1 2 3
| typedef int Status; typedef char SString[MAXSTRLEN]; int next[MAXNEXTLEN];
|
(三)求next数组的子函数
1 2 3 4 5 6 7 8 9 10 11
| void get_next(SString T,int next[]) { int i=1,j=0; next[1]=0; while(i<MAXNEXTLEN) { if(j==0||T[i]==T[j]) {i++;j++;next[i]=j;} else j=next[j]; } }
|
(四)KMP算法的子函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int Index_KMP(SString S,SString T,int pos)
{ int i=pos,j=1; int Tnumber=strlen(T)-1; while(i<=MAXSTRLEN&&j<=Tnumber) { if(j==0||S[i]==T[j]) {++i;++j;} else j=next[j]; } if(j>Tnumber) return i; else return 0; }
|
(五)主函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| int main() { int pos=1; int i=0; SString S; char ch; FILE *fp; int j=0; if((fp=fopen("C:\\Documents and Settings\\Administrator\\桌面\\rzh\\bbs.html","r"))==NULL) { printf("Open the file failure.\n"); exit(0); } while(j<MAXSTRLEN) { if((ch=fgetc(fp))!=EOF) { S[j]=ch; } j++; } fclose(fp); S[j]='\0'; char D[]={"发信人:"}; printf("发信人ID为:"); get_next(D,next); i=Index_KMP(S,D,pos); while(S[i]!='(') { printf("%c",S[i]); i++; } printf("\n"); pos=1; char M[]={"发信站: 兵马俑BBS ("}; printf("发贴时间为:"); get_next(M,next); i=Index_KMP(S,M,pos); while(S[i]!=')') { printf("%c",S[i]); i++; } printf("\n"); pos=1; char T[]={"FROM:"}; printf("发贴IP为:"); get_next(T,next); i=Index_KMP(S,T,pos); while(S[i]!=']') { printf("%c",S[i]); i++; } printf("\n");
return 0;
}
|
三、运行结果分析
从交大兵马俑bbs上保存了两个网页分别进行了检验,运行结果如下:
都成功地读取了信息。 网页截图: