数据结构实验报告-串

合集下载

数据结构串的实验总结

数据结构串的实验总结

数据结构串的实验总结《数据结构串的实验总结》整体感受嘛,这数据结构中的串实验就像一场充满挑战与惊喜的旅程。

开始的时候,真觉得有些头疼,就像面对一个错综复杂的迷宫,完全不知道从哪儿入手。

具体收获可真是不少。

首先,我对串的基本概念有了透彻的理解,什么是串,串的长度、空串、空格串等等。

在实现串的操作时,比如串的连接、匹配之类的,那可真是让我费了不少心思。

比如说在实现串的模式匹配算法中的BF算法时,我才清楚需要挨个比较字符,就像在人群中逐个查找一个特定的人一样辛苦但又很有成就感。

还有KMP算法,这个算法刚开始理解简直难上天了,它那复杂的部分匹配值计算和next数组的构建,但是一旦理解了它的精髓,就感觉像发现了一个快捷通道。

原来KMP 算法就是利用已经比较过的信息,避免不必要的比较,就像你走过一遍迷宫,记住了哪些路是死胡同,下次走的时候就可以避开了。

重要发现也得记一笔。

在做串的存储结构实验的时候,我发现顺序存储结构在某些情况下很方便,比如串的长度固定或者不需要频繁插入删除的时候。

而链式存储结构则在灵活处理串的变化方面更有优势,这就像是住在公寓和房车的区别,一个固定但是稳定,一个虽然变动大但是更灵活,可以随时根据需求调整内部布局。

反思一下,自己在做实验的过程中太过于关注实现结果而忽略了算法的时间复杂度和空间复杂度优化。

比如在BF算法中,如果字符串很长,那简单的逐个比较效率是非常低的,当时怎么就没有多想想怎么优化呢,真是太不应该了。

现在想想,如果当时能从一开始就着重关注效率方面的问题,后面可能就不需要花这么多时间返工了。

从这个串的实验中得到的启示就是做事情之前一定要考虑全面。

遇到难题的时候不要害怕,像理解KMP算法一样,多花时间多思考,总能找到解决方案的。

而且在解决问题的过程中,要不断思考有没有更好更高效的方法,不能仅仅满足于把功能实现了就好。

要从各个方面去考量,就像看待一个人的综合素质一样,不仅要看他能不能完成任务,还要看他完成任务的质量和效率。

数据结构_实验3_串和数组

数据结构_实验3_串和数组

实验3 串和数组的相关操作一,实验目的理解并掌握串的逻辑结构和定长顺序存储方式;理解串的相关基本算法;编程对相关算法进行验证。

理解数组的逻辑结构和顺序存储方式;掌握对称矩阵和稀疏矩阵的压缩存储方法;掌握稀疏矩阵的三元组顺序表表示法和快速转置运算。

二,实验内容3.1 串的模式匹配运算编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上设计主程序完成如下功能:(1)建立目标串s=‘abcabcdabcdeabcdefabcdefg’和模式串t=‘abcdeabcdefab’;(2)采用简单模式匹配算法求t在s中的位置;(3)由模式串t求出next值和nextval值;(4)采用KMP算法求t在s中的位置;(5)采用改进的KMP算法求t在s中的位置。

3.2 数组的操作1.建立一个n*n的对称矩阵A;用动态分配的一维数组B对矩阵A进行压缩存储,输出矩阵A和一维数组B;2.在B中查找对称矩阵A中第row行,第col列(下标从1开始)的元素,输出该元素值;3.建立一个稀疏矩阵C,输入其行数,列数和非零元个数,用三元组顺序表存储该矩阵,并按矩阵形式输出稀疏矩阵B;4.对稀疏矩阵C做快速转置运算得到矩阵D,并按矩阵形式输出转置后的矩阵D。

【要求】1.矩阵元素相关信息要从终端输入;2.在三元组顺序表中按行优先顺序存放非零元素;3.具体的输入和输出格式不限;4.算法要具有较好的健壮性,对错误操作要做适当处理。

三,源代码及结果截图3.1#include<stdio.h>#include<string.h>#include<malloc.h>#define MaxSize 100typedef struct {char data[MaxSize]; //定义可容纳MaxSize个字符的空间 int length; //标记当前实际串长}SqString;void StrAssign(SqString &str,char cstr[]){ //由串常量cstr创建串strint i;for(i=0;cstr[i]!='\0';i++)str.data[i]=cstr[i];str.length=i;}void DispStr(SqString s){ //输出串s的所有元素int i;if(s.length>0){for(i=0;i<s.length;i++)printf("%c",s.data[i]);printf("\n");}}int Index(SqString s,SqString t){ //简单匹配算法int i=0,j=0,k;while(i<s.length && j<t.length){if(s.data[i]==t.data[j]){ //继续匹配下一个字符i++;j++;}else{ //主串、子串指针回溯重新开始下一次匹配i=i-j+1;j=0;}}if(j>=t.length)k=i-t.length; //返回匹配的第一个字符的下标 elsek=-1; //模式匹配不成功return k;}void GetNext(SqString t,int next[]){ //由模式串t求出next值int j,k;j=0;k=-1;next[0]=-1;while(j<t.length-1){if(k==-1 || t.data[j]==t.data[k]){j++;k++;next[j]=k;}elsek=next[k];}}void GetNextval(SqString t,int nextval[]){ //由模式串t求出nextval值int j=0,k=-1;nextval[0]=-1;while(j<t.length){if(k==-1 || t.data[j]==t.data[k]){j++;k++;if(t.data[j]!=t.data[k])nextval[j]=k;elsenextval[j]=nextval[k];}else k=nextval[k];}}int KMPIndex(SqString s,SqString t){ //KMP算法int next[MaxSize],i=0,j=0,v;GetNext(t,next);while(i<s.length && j<t.length){if(j==-1 || s.data[i]==t.data[j]){i++;j++;}elsej=next[j]; //i不变,j后退}if(j>=t.length)v=i-t.length; //返回匹配模式串的首字符下标 elsev=-1; //返回不匹配标志return v;}int KMPIndex1(SqString s,SqString t){ //改进的KMP算法int nextval[MaxSize],next[MaxSize],i=0,j=0,v;GetNextval(t,next);GetNextval(t,nextval);while(i<s.length && j<t.length){if(j==-1 || s.data[i]==t.data[j]){i++;j++;}elsej=nextval[j];}if(j>=t.length)v=i-t.length; //返回匹配模式串的首字符下标elsev=-1;return v;}int main(){int j;int next[MaxSize],nextval[MaxSize];SqString s,t;StrAssign(s,"abcabcdabcdeabcdefabcdefg");StrAssign(t,"abcdeabcdefab");printf("目标串s:");DispStr(s);printf("模式串t:");DispStr(t);printf("简单匹配P算法:\n");printf("t在s中的位置=%d\n",Index(s,t));GetNext(t,next); //由模式串t求出next值GetNextval(t,nextval); //由模式串t求出nextval值 printf(" j ");for(j=0;j<t.length;j++)printf("%d",j);printf("\n");printf("t[j] ");for(j=0;j<t.length;j++)printf("%c",t.data[j]);printf("\n");printf("next ");for(j=0;j<t.length;j++)printf("%d",next[j]);printf("\n");printf("nextval");for(j=0;j<t.length;j++)printf("%d",nextval[j]);printf("\n");printf("KMP算法:\n");printf("t在s中的位置=%d\n",KMPIndex(s,t));printf("改进的KMP算法:\n");printf("t在s中的位置=%d\n",KMPIndex1(s,t));return 0;}结果截图:3.2#include<string.h>#include<ctype.h>#include<malloc.h> //malloc( )#include<limits.h> // INT ,MAX#include<stdio.h> //EOF,NULL#include<stdlib.h> //atoi( )#include<io.h> //eof( )#include<math.h> //floor( ),ceil( ),abs( ) #include<process.h> //exit( )#include<iostream.h> //cout,cin//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1//OVERFLOW 在 math.h 中已定义为3typedef int Status;typedef int Boolean; // 布尔类型#define MAXSIZE 100typedef int ElemType;typedef struct {int i,j;ElemType e;}Triple ;typedef struct{Triple data[MAXSIZE+1];int mu,nu,tu;}TSMatrix;typedef struct{ElemType ms[MAXSIZE][MAXSIZE];int line;}MMatrix;ElemType B[(MAXSIZE+1)*50+1];void PrinTMMatrix(MMatrix M){int i,j;for (i=1;i<=M.line;i++){for (j=1;j<=M.line;j++){printf("%d\t",M.ms[i][j]);}putchar('\n');}}Status CreateMatrix(MMatrix &M){int i,j;printf("输入行数,行和列相等:\n");scanf("%d",&M.line);for (i=1;i<=M.line;i++){printf("输入第%d行数据:\n",i);for (j=1;j<=M.line;j++){scanf("%d",&M.ms[i][j]);}}printf("输出矩阵A:\n");PrinTMMatrix(M);return OK;}Status GetMMValue(MMatrix M,ElemType &e) {int i,j;printf("请输入要查找的行号,列号:\n");fflush(stdin);scanf("%d%d",&i,&j);if (i>M.line||j>M.line){printf("已经越界,无法取值\n");return ERROR;}else{int k;if (i>=j){k = i*(i-1)/2+j;}elsek=j*(j-1)/2+i;e = B[k];printf("取出的值为:%d\n",e);}return OK;}Status CutMMatrix(MMatrix &M){int i,j;for (i=1;i<=M.line;i++){for (j=i+1;j<=M.line;j++){if (M.ms[i][j]!=M.ms[j][i]){printf("不是对称矩阵请重新输入:\n");CreateMatrix(M);CutMMatrix(M);return OK;}}}printf("输出一维数组B:\n");int k=1;for (i=1;i<=M.line;i++){for (j=1;j<=i;j++){B[k++] = M.ms[i][j];printf("%d%d\t",B[k-1],M.ms[i][j]);}}printf("\n");return OK;}Status InitMatirx(TSMatrix &T){int i;T.tu = 1;printf("建立稀疏矩阵C:\n");printf("输入行数,列数,输入三元组个数\n");scanf("%d%d%d",&T.mu,&T.nu,&T.tu);for (i=1;i<=T.tu;i++){printf("输入第%d组三元组行号,列号,值(请按照行优先顺序)\n",i);scanf("%d%d%d",&T.data[i].i,&T.data[i].j,&T.data[i].e);}return OK;;}void PrintMatrix(TSMatrix T){int i,j,k=1;for(i=1;i<=T.mu;i++){for(j=1;j<=T.nu;j++){if(T.data[k].i==i&&T.data[k].j==j){printf("%d\t",T.data[k].e);k++;}else{printf("%d\t",0);}}printf("\n");}}int FastTransposeMatrix(TSMatrix M,TSMatrix &T){int col,t,p,q;int num[20],cpot[20];cpot[1] =1;T.mu = M.nu ;T.nu = M.mu ;T.tu = M.tu ;if(T.tu){for(col=1;col<=M.nu;col++)num[col] = 0;for(t=1;t<=M.tu;t++)++num[M.data[t].j];for(col=2;col<=M.nu;col++)cpot[col]=cpot[col-1]+num[col-1];for(p=1;p<=M.tu;p++){col = M.data[p].j;q = cpot[col];T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e;++cpot[col];}}return 1;}main(){MMatrix A;CreateMatrix(A);CutMMatrix(A);ElemType e;GetMMValue(A,e);TSMatrix B,D;InitMatirx(B);printf("输出稀疏矩阵B:\n");PrintMatrix(B);printf("\n转置后的矩阵D:\n");FastTransposeMatrix(B,D);PrintMatrix(D);}结果截图:四,小结(1)本次实验的程序需要熟读课本后才能编写,其中第一个程序相对简单。

数据结构实验报告及心得体会

数据结构实验报告及心得体会

数据结构实验报告及心得体会一、概述:介绍本次实验的目的、背景以及所使用的实验环境和工具。

本次实验旨在通过实际操作,深入理解和掌握数据结构的原理及应用。

实验背景源于课程学习的理论知识与实际应用相结合的需求,通过实验操作,期望能够将课堂所学的数据结构知识更好地运用到实际编程和解决现实问题中。

本次实验所使用的实验环境为先进的计算机实验室,配备了高性能的计算机硬件和丰富的软件开发工具。

为了完成实验,我使用了Java编程语言,并结合Eclipse开发环境进行编程和调试。

我还参考了相关的数据结构专业书籍和在线资源,以便更好地理解和应用数据结构知识。

在实验过程中,我严格按照实验指导书的步骤进行操作,并认真记录了实验数据和结果。

通过本次实验,我深刻体会到了数据结构的重要性,也对数据结构的实现和应用有了更深入的了解。

二、实验内容:分别介绍线性数据结构(线性表)、非线性数据结构(二叉树、图)的实验内容,包括其实现方法、操作过程等。

每个实验都包含具体的实验目的和预期结果。

三、实验过程及结果分析:详细描述实验过程,包括实验步骤的执行情况,遇到的问题及解决方法。

对实验结果进行展示,并进行数据分析和结论。

这部分是实验报告的核心部分,体现了学生的实践能力和问题解决能力。

四、心得体会:分享在实验过程中的心得体会,包括遇到的困难、收获,对数据结构的理解与认识提升,以及实验过程中的团队协作和学习体验等。

这部分内容可以体现出学生的思考深度和学习的主观感受。

五、总结与展望:对本次实验报告进行总结,并对未来数据结构与算法的学习提出展望和建议。

这部分内容可以帮助学生梳理所学知识,明确未来的学习方向。

数据结构实验报告《三、串及其应用》

数据结构实验报告《三、串及其应用》

数据结构实验报告《三、串及其应用》时间:20XX年X月X日数据结构实验报告- - - - 串及其应用之文学研究助手【问题描述】文学研究人员需要统计某篇英文小说中某些单词(特别是形容词)的出现次数和位置,甚至连数字和标点符号的个数也可以统计。

试写一个实现这一目标的文字统计系统,称为“文学研究助手”。

【基本要求】1、输入一页文字,静态存储一页文章,每行最多不超过80个字符,共N行;2、分别统计出其中英文字母数、空格数、标点符号及整篇文章总字数;3、统计某一字符串在文章中出现的次数,并输出该次数;4、删除某一子串,并将后面的字符前移。

【运用拓展】1、保存输入文章到本地text文本中;2、模式匹配基于KMP算法;3、仿真友好界面显示:(1)、要求用菜单选择操作,分别用几个子函数实现相应的功能;(2)、输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

(3)、输出形式:1)、分行输出用户输入的各行字符;2)、分5行输出“全部字母数“、“数字个数“、“空格个数“、“标点符号个数”“文章总字数“;3)、输出删除某一字符串后的文章。

【涉及的知识点】链串的插入,删除,查找,模式匹配(knp算法)及文件的写入与写出,用switch,case语句进行菜单的选择,用while 语句进行循环,用if语句进行条件的判断等等。

【设计思路】、总体思路:本文采用链式存储字符串,链串的插入采用后插法,以‘#’ 为字符串结束的标志。

在插入字符串的同时用文件存储字符串。

、删除算法的基本思路:输入要删除的字符串,同样以‘#’结束,然后在文中查找该字符串,若找到了则把它删除,同时长度要减少;否则,没找到不能删除。

查找算法与删除算法类似;但也有不同之处,不同在于:这里是要查找某字符串在文中出现的次数,因此,当找到该字符串后还要继续往后查找,并将次数加1;直到文章的末尾才结束查找。

、用菜单做选择:用switch,case语句进行选择判断,并用类的对象调用类的成员函数以实现特定的功能。

串的存储实验报告(3篇)

串的存储实验报告(3篇)

第1篇一、实验目的1. 理解串的概念及其在计算机中的应用。

2. 掌握串的存储方式及其在C语言中的实现。

3. 熟悉串的基本操作,如串的创建、串的复制、串的连接等。

4. 通过实验验证串操作的准确性和效率。

二、实验原理1. 串(String)是由零个或多个字符组成的有限序列,是计算机中常用的非数值数据类型。

2. 串的存储方式主要有两种:顺序存储和链式存储。

3. 顺序存储是将串的字符序列存储在一段连续的内存空间中,通过数组来实现。

4. 链式存储则是通过链表来实现,每个节点存储一个字符,节点之间通过指针连接。

三、实验环境1. 操作系统:Windows 102. 编程语言:C3. 编译器:Visual Studio 2019四、实验内容1. 创建一个串,并对其进行初始化。

2. 复制一个串,并验证复制的串与原串内容相同。

3. 连接两个串,并验证连接后的串内容。

4. 实现串的插入、删除、查找等操作。

5. 对串进行排序,如按字典序排序。

五、实验步骤1. 创建一个串```cinclude <stdio.h>include <stdlib.h>include <string.h>define MAX_SIZE 100typedef struct {char data[MAX_SIZE];int length;} String;// 创建串String createString(const char str) { String s;strcpy(s.data, str);s.length = strlen(str);return s;}```2. 复制一个串```c// 复制串String copyString(const String s) { String t;strcpy(t.data, s.data);t.length = s.length;return t;}```3. 连接两个串```c// 连接两个串String concatString(const String s1, const String s2) { String s;strcpy(s.data, s1.data);strcat(s.data, s2.data);s.length = s1.length + s2.length;return s;}```4. 实现串的插入、删除、查找等操作```c// 插入字符void insertChar(String s, int pos, char ch) {if (pos < 0 || pos > s->length) {printf("Insert position is invalid.\n");return;}for (int i = s->length; i >= pos; i--) {s->data[i + 1] = s->data[i];}s->data[pos] = ch;s->length++;}// 删除字符void deleteChar(String s, int pos) {if (pos < 0 || pos >= s->length) {printf("Delete position is invalid.\n"); return;}for (int i = pos; i < s->length - 1; i++) { s->data[i] = s->data[i + 1];}s->length--;}// 查找字符int findChar(const String s, char ch) {for (int i = 0; i < s.length; i++) {if (s.data[i] == ch) {return i;}}return -1;}```5. 对串进行排序```c// 字典序排序void sortString(String s) {for (int i = 0; i < s->length - 1; i++) {for (int j = i + 1; j < s->length; j++) {if (s->data[i] > s->data[j]) {char temp = s->data[i];s->data[i] = s->data[j];s->data[j] = temp;}}}}```六、实验结果与分析1. 创建串、复制串、连接串等操作均能正常进行,验证了串的存储和操作的正确性。

串的实验报告总结

串的实验报告总结

串的实验报告总结本次实验旨在研究串(String)数据类型在计算机编程中的应用。

通过对串的基本操作和常见算法进行实验,探索串在字符串处理、文本编辑等方面的实际应用。

本报告将总结实验过程、结果及结论,并提出对进一步研究的展望。

实验内容与方法1.实验内容本次实验主要包括以下内容:-字符串的输入和输出;-串的基本操作,如串的连接、截取、插入等;-串的模式匹配算法,如KMP算法;-串的排序算法,如快速排序。

2.实验方法为了完成上述实验内容,我们采用了以下方法:-使用编程语言(如C++、Java)来实现串数据类型及其相关操作;-设计测试样例,验证实现的正确性和效率;-运行程序,记录实验结果并进行分析。

实验结果与分析经过实验,我们得到了以下结果和分析:1.字符串的输入和输出操作实现了预期的功能,可以正确地读取和显示字符串数据。

2.串的基本操作(连接、截取、插入等)能够正确地处理字符串,并且具有良好的效率。

3.KMP算法作为一种高效的模式匹配算法,能够快速地在文本中搜索指定的模式串,并返回匹配结果。

4.快速排序算法作为一种常用的排序算法,在处理大量字符串数据时表现出了较高的效率。

结论与展望通过本次实验,我们对串数据类型及其基本操作和常见算法有了更深入的理解。

串在计算机编程中具有重要的应用价值,特别是在字符串处理和文本编辑方面。

实验结果显示,实现的串操作功能正常,并且在性能上达到了预期的要求。

然而,本次实验还有改进和拓展的空间。

首先,可以进一步研究优化串的操作效率,提升算法的执行速度。

其次,可以探索更多的串算法,如字符串匹配的其他算法(如BM算法、Trie树等)以及字符串压缩算法等。

此外,可以考虑将串的应用扩展到更多领域,如自然语言处理、数据挖掘等。

综上所述,本次实验对于串数据类型的研究和应用具有重要意义,为进一步深入探索串的应用提供了基础和启示。

我们期待未来在串的研究中取得更多的成果,并将其应用于实际的计算机编程和软件开发中。

串及其应用的实验报告

串及其应用的实验报告

一、实验目的1. 理解串的概念及其基本操作。

2. 掌握串的创建、插入、删除、查找等操作。

3. 学习串在具体应用场景中的应用。

二、实验原理串(String)是一种特殊的线性表,它是由若干字符构成的有限序列。

串的基本操作包括创建、插入、删除、查找等。

在计算机科学中,串广泛应用于文本处理、字符串匹配、自然语言处理等领域。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验内容1. 串的创建2. 串的插入3. 串的删除4. 串的查找5. 串在文本处理中的应用五、实验步骤1. 串的创建(1)定义串的结构体```cppstruct String {char data; // 指向串中字符的指针int length; // 串的长度};```(2)创建串```cppString createString(const char str) {String s;s.data = new char[strlen(str) + 1]; // 为串分配内存strcpy(s.data, str); // 复制字符串到串中s.length = strlen(str); // 设置串的长度return s;}```2. 串的插入(1)在串的指定位置插入字符```cppvoid insertChar(String& s, int position, char ch) {if (position < 0 || position > s.length) {return; // 插入位置不合法}char newData = new char[s.length + 2]; // 为新串分配内存 strcpy(newData, s.data); // 复制原串到新串newData[position] = ch; // 在指定位置插入字符strcpy(s.data, newData); // 复制新串到原串s.length++; // 更新串的长度}```(2)在串的指定位置插入子串```cppvoid insertSubstring(String& s, int position, const char subStr) {if (position < 0 || position > s.length) {return; // 插入位置不合法}char newData = new char[s.length + strlen(subStr) + 1]; // 为新串分配内存strcpy(newData, s.data); // 复制原串到新串strcpy(newData + position, subStr); // 在指定位置插入子串strcpy(s.data, newData); // 复制新串到原串s.length += strlen(subStr); // 更新串的长度}```3. 串的删除(1)删除串中的单个字符```cppvoid deleteChar(String& s, int position) {if (position < 0 || position >= s.length) {return; // 删除位置不合法}char newData = new char[s.length]; // 为新串分配内存strcpy(newData, s.data); // 复制原串到新串strcpy(newData + position, newData + position + 1); // 删除指定位置的字符strcpy(s.data, newData); // 复制新串到原串s.length--; // 更新串的长度}```(2)删除串中的子串```cppvoid deleteSubstring(String& s, const char subStr) {int position = s.indexOf(subStr); // 查找子串的位置if (position == -1) {return; // 子串不存在}deleteChar(s, position); // 删除子串}```4. 串的查找(1)查找串中的单个字符```cppint indexOfChar(const String& s, char ch) {for (int i = 0; i < s.length; i++) {if (s.data[i] == ch) {return i; // 找到字符,返回位置}}return -1; // 未找到字符,返回-1}```(2)查找串中的子串```cppint indexOfSubstring(const String& s, const char subStr) {for (int i = 0; i <= s.length - strlen(subStr); i++) {if (strncmp(s.data + i, subStr, strlen(subStr)) == 0) {return i; // 找到子串,返回位置}}return -1; // 未找到子串,返回-1}```5. 串在文本处理中的应用(1)字符串替换```cppvoid replaceSubstring(String& s, const char oldStr, const char newStr) { int position = indexOfSubstring(s, oldStr);while (position != -1) {deleteSubstring(s, oldStr); // 删除旧子串insertSubstring(s, position, newStr); // 插入新子串position = indexOfSubstring(s, oldStr); // 继续查找旧子串}}```(2)字符串排序```cppvoid sortString(String& s) {char temp = new char[s.length + 1];strcpy(temp, s.data);qsort(temp, s.length, sizeof(char), [](const void a, const void b) { return (const char)a - (const char)b;});strcpy(s.data, temp);delete[] temp;}```六、实验结果与分析1. 创建串:通过创建一个包含“Hello, World!”的串,验证了串的创建功能。

串及其应用的实验报告

串及其应用的实验报告

串及其应用的实验报告串及其应用的实验报告引言:串是计算机科学中一种基本的数据结构,它由一系列字符组成,可以是字母、数字或其他符号。

在计算机编程中,串常常用于存储和处理文本信息。

本实验旨在通过实践操作,探索串的基本特性和应用。

实验一:串的创建和操作1. 实验目的通过编写程序,学习串的创建和操作方法。

2. 实验步骤(1)使用编程语言创建一个空串。

(2)向串中添加字符,观察串的变化。

(3)使用串的长度函数,计算串的长度。

(4)使用串的比较函数,比较两个串的大小。

(5)使用串的连接函数,将两个串连接起来。

(6)使用串的截取函数,截取指定位置和长度的子串。

3. 实验结果通过实验步骤的操作,我们成功创建了一个空串,并向其中添加了字符。

使用长度函数计算出了串的长度,并使用比较函数比较了两个串的大小。

通过连接函数,我们将两个串连接成了一个新的串。

最后,使用截取函数,我们截取了指定位置和长度的子串。

实验二:串的模式匹配1. 实验目的通过实验操作,了解串的模式匹配算法。

2. 实验步骤(1)使用编程语言实现串的模式匹配算法。

(2)创建一个主串和一个模式串。

(3)使用模式匹配算法,在主串中查找模式串的位置。

3. 实验结果通过实验步骤的操作,我们成功实现了串的模式匹配算法。

创建了一个主串和一个模式串,并使用算法在主串中找到了模式串的位置。

实验三:串的应用——文本编辑器1. 实验目的通过实验操作,熟悉串的应用——文本编辑器。

2. 实验步骤(1)使用编程语言实现一个简单的文本编辑器。

(2)实现文本插入、删除和替换功能。

(3)实现文本搜索和替换功能。

3. 实验结果通过实验步骤的操作,我们成功实现了一个简单的文本编辑器。

可以插入、删除和替换文本,还可以进行文本搜索和替换。

结论:通过本次实验,我们对串及其应用有了更深入的了解。

串作为计算机科学中常用的数据结构,具有广泛的应用领域。

通过实践操作,我们掌握了串的创建和操作方法,并学会了串的模式匹配和文本编辑器的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构与算法》实验指导V2016 1 实验四 串 【实验目的】 1、掌握串的存储表示及基本操作; 2、掌握串的两种模式匹配算法:BF和KMP。 3、了解串的应用。

【实验学时】 2学时

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

【实验内容和要求】 1、按照要求完成程序exp4_1.c,实现串的相关操作。调试并运行如下测试数据给出运行结果:  求“This is a boy”的串长;  比较”abc3”和“abcde“;表示空格  比较”english”和“student“;  比较”abc”和“abc“;  截取串”white”,起始2,长度2;  截取串”white”,起始1,长度7;  截取串”white”,起始6,长度2;  连接串”asddffgh”和”12344”;

#include #include #define MAXSIZE 100 #define ERROR 0 #define OK 1

/*串的定长顺序存储表示*/ 《数据结构与算法》实验指导V2016 2 typedef struct { char data[MAXSIZE]; int length; } SqString;

int strInit(SqString *s); /*初始化串*/ int strCreate(SqString *s); /*生成一个串*/ int strLength(SqString *s); /*求串的长度*/ int strCompare(SqString *s1,SqString *s2); /*两个串的比较*/ int subString(SqString *sub,SqString *s,int pos,int len); /*求子串*/ int strConcat(SqString *t,SqString *s1,SqString *s2); /*两个串的连接*/

/*初始化串*/ int strInit(SqString *s) { s->length=0; s->data[0]='\0'; return OK; }/*strInit*/

/*生成一个串*/ int strCreate(SqString *s) { printf("input string :"); gets(s->data); s->length=strlen(s->data); return OK; }/*strCreate*/

/*(1)---求串的长度*/ int strLength(SqString *s) { return s->length; }/*strLength*/

/*(2)---两个串的比较,S1>S2返回>0,s1int strCompare(SqString *s1,SqString *s2) { int i; for(i=0;ilength&&ilength;i++) { if(s1->data[i]>s2->data[i]) { 《数据结构与算法》实验指导V2016 3 return 1; } if(s1->data[i]data[i]) { 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{ sub->data[i]=s->data[i+pos-1]; sub->length++; } sub->data[i]='\0'; return OK; }/*subString*/

/*(4)---两个串连接,s2连接在s1后,连接后的结果串放在t中*/ int strConcat(SqString *t,SqString *s1,SqString *s2) { int i=0,j=0; while(ilength) { t->data[i]=s1->data[i]; i++; } while(jlength) { t->data[i++]=s2->data[j++]; } t->data[i]='\0'; t->length=s1->length+s2->length; return OK; 《数据结构与算法》实验指导V2016 4 }/*strConcat*/ int main() { int n,k,pos,len; SqString s,t,x; do { printf("\n ---String--- \n"); printf(" 1. strLentgh\n"); printf(" 2. strCompare\n"); printf(" 3. subString\n"); printf(" 4. strConcat\n"); printf(" 0. EXIT\n"); 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 %d\n",strLength(&s)); break; case 2: printf("\n***show 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 stringelse printf("first string>second string!\n"); break; case 3: printf("\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 %s\n",t.data); 《数据结构与算法》实验指导V2016 5 else printf("pos or len ERROR!\n"); break; case 4: printf("\n***show subConcat***\n"); strCreate(&s); strCreate(&t); if(strConcat(&x,&s,&t)) /*(6)---调用串连接函数连接s&t*/ printf("Concat string is %s",x.data); else printf("Concat ERROR!\n"); break; case 0: exit(0); default: break; } } while(n); return 0; }2、按照要求完成程序exp4_2.c,实现BF&KMP串的模式匹配算法。调试及测试数据并给出结果:  应用BF算法求子串”JING”在主串”BEIJING”中的位置,测试起始位置分别为1和5的情况;  应用KMP算法求子串”abaabcac”在主串”acabaabaabcacaabc”中的位置,测试起始位置分别为1,10的情况,并写出子串的next[]值;

exp4_2.c部分代码如下: #include #include #define MAXSIZE 100 #define ERROR 0 #define OK 1

/*串的定长顺序存储表示*/ typedef struct { char data[MAXSIZE]; int length; } SqString;

int strCreate(SqString *s); int indexBf(SqString *s,SqString *t,int pos); /*串的模式匹配BF*/ void getNext(SqString *t,int next[]); /*KMP求next值*/

相关文档
最新文档