文学研究助手数据结构报告
数据结构实验报告_实验报告_
数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。
本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。
2) 利用栈,实现任一个表达式中的语法检查(选做)。
3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验实训报告范文
一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。
2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。
3. 培养动手实践能力,提高编程水平。
二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。
单词统计程序 C++
单词统计问题描述文字研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置,试写出一个实现这一目标的文字统计系统。
这称为“文学研究助手”。
要求算法输入:文本文件和词集。
算法输出:单词出现的次数,出现位置所在行的行号(同一行出现两次的只输出一个行号)。
算法要点:(1)文本串非空且以文件形式存放。
(2)单词定义:用字母组成的字符序列,中间不含空格,不区分大小写。
(3)待统计的单词不跨行出现,它或者从行首开始,或者前置一个空格。
(4)数据结构采用二维链表,单词结点链接成一个链表,每个单词的行号组成一个链表,单词结点作为行号链表的头结点。
需求分析用户需求:用户可以通过该程序查询和统计一篇英文文章中某些特定单词出现次数和位置。
功能需求:用户可以输入单词来查询单词出现次数和位置;程序可以正确显示查询结果;用户可以选择是否在一次输出后继续查询;在一次查询中的结果记录到一个二维链表中。
概要设计为达到设计要求,本程序采用二维链表存储单词结点和相关的位置信息。
抽象数据类型:struct node{int col; //行坐标int row; //所在行的列坐标node* next; //指向下一个坐标结点的指针}; //单词坐标坐点类型struct Node{char words[20]; //单词数组node* ptr; //指向单词坐标结点的指针Node* next; //指向下一个单词结点的指针int num; //单词所含字符个数}; //单词结点class TLink{public:TLink() { head = NULL; }//构造函数~TLink()//析构函数{while( head != NULL ){Node* temp;temp = head;head = head -> next;delete temp;}}void Insert( char* Item );//前条件:参数Item[]为一个字符数组。
数据结构实验报告
数据结构实验报告引言:本实验旨在通过对数据结构的学习和实践,加深对数据结构的理解和运用能力。
在本实验中,我们将探索各种数据结构的特点、优势和适用场景,并通过实验验证它们的效果和性能。
本报告将详细介绍实验的目的、实验设计和实验结果,以及对结果的分析和总结。
一、实验目的:本实验的主要目的是帮助学生理解和掌握以下内容:1. 数据结构的基本概念和分类;2. 各种数据结构的特点、优势和适用场景;3. 数据结构的实现方式和算法;4. 数据结构的性能分析和优化。
二、实验设计:1. 实验环境:本次实验使用的编程语言为C++,开发环境为Visual Studio。
2. 实验内容:本次实验包括以下几个部分:(1)线性表的实现和应用;(2)栈和队列的实现和应用;(3)树和图的实现和应用;(4)排序和查找算法的实现和应用。
3. 实验步骤:(1)根据实验要求,选择合适的数据结构进行实现;(2)编写相应的代码,并进行调试;(3)运行程序,测试数据结构的功能和性能;(4)根据实验结果进行分析和总结。
三、实验结果:1. 线性表的实现和应用:在本次实验中,我们实现了顺序表和链表两种线性表结构,并对它们进行了性能测试。
通过测试,我们发现顺序表适用于频繁进行查找操作的场景,而链表适用于频繁进行插入和删除操作的场景。
2. 栈和队列的实现和应用:我们实现了栈和队列两种数据结构,并进行了相应的性能测试。
通过测试,我们发现栈适用于需要实现后进先出(LIFO)的场景,而队列适用于需要实现先进先出(FIFO)的场景。
3. 树和图的实现和应用:我们实现了二叉树和图两种数据结构,并进行了相应的性能测试。
通过测试,我们发现二叉树适用于需要进行快速查找和排序的场景,而图适用于需要表示复杂关系和网络结构的场景。
4. 排序和查找算法的实现和应用:我们实现了常见的排序和查找算法,并进行了相应的性能测试。
通过测试,我们发现快速排序和二分查找算法在大规模数据处理中具有较高的效率和性能。
数据结构 实验报告
数据结构实验报告数据结构是计算机科学中重要的概念之一,它是计算机存储、组织数据的方式和方法。
在计算机科学的课程中,数据结构通常是一门重要的课程,也是程序设计的基础。
本文将围绕数据结构展开,介绍其基本概念、分类和应用。
一、基本概念数据结构是指数据元素之间的关系和操作方法的集合。
它包括两个方面的内容,一是数据元素之间的逻辑关系,二是数据元素的存储结构。
数据元素之间的逻辑关系可以是线性关系(如线性表、队列、栈等),也可以是非线性关系(如树、图等)。
数据元素的存储结构可以是顺序存储结构(如数组),也可以是链式存储结构(如链表)。
二、分类根据数据元素之间的关系,数据结构可以分为线性结构和非线性结构。
线性结构是指数据元素之间存在一对一的关系,如线性表、队列、栈等;非线性结构是指数据元素之间存在一对多或多对多的关系,如树、图等。
根据数据元素的存储结构,数据结构可以分为顺序存储结构和链式存储结构。
顺序存储结构是指数据元素按照一定的顺序存放在连续的存储单元中,如数组;链式存储结构是指数据元素按照不同的存储地址存放在不同的存储单元中,通过指针来连接,如链表。
三、应用数据结构在计算机科学中有广泛的应用。
首先,它是算法设计和分析的基础。
算法是解决问题的方法和步骤,而数据结构是算法的载体。
不同的数据结构适用于不同的算法,选择合适的数据结构可以提高算法的效率。
数据结构在数据库系统中起着重要的作用。
数据库是指存储和管理大量数据的系统,而数据结构是数据库的内部实现方式。
合理的数据结构设计可以提高数据库的查询和操作效率。
数据结构在图形学和计算机图像处理中也有重要的应用。
图形学是研究计算机图像的表示和处理方法的领域,而数据结构是图形学算法的基础。
例如,二叉树广泛应用于图形学中的空间划分和三维模型的表示。
数据结构还在人工智能和机器学习中发挥着重要的作用。
人工智能是研究如何使计算机能够模拟人类智能的学科,而机器学习是人工智能的一个重要分支。
数据结构课程设计实验报告
青岛理工大学数据结构课程设计报告题目一:魔王语言解释题目二:文学研究助手院(系):计算机工程学院学生姓名: 龚剑勇班级:计算机科学与技术092学号:200907079起迄日期: 2011/6/20——2011/6/30指导教师: 张艳2010—2011年度第 2 学期题目一:魔王语言解释一、需求分析[问题描述]有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α-> β1β2…βm(2)(θδ1δ2…δn)->θδnθδn-1…θδ1θ在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
[基本要求]用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B -> tAdA(2)A -> sae[测试数据]B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t d s a e z g x n h天地上一只鹅追赶下蛋恨二、概要设计1,程序设计思路(1)以一维数组demon[ i ]表示魔王语言.(2)魔王语言由用户输入,初始保存在demon[ i ]中.(3)魔王语言与人类语言对应关系固化在程序中.(4)实现过程:A:初始,魔王语言接收后存放在demon[ i ]中.B:初次遍历数组,将数组中括号内的元素入栈,同时插入相应首字母;C:再次遍历数组,将数组元素依次入队。
(小写字母直接入队;大写字母经翻译成相应字符后入队;遇到括号,将栈中保存的元素依次出栈入队)在翻译过程中,如果依旧包含大写字母,则置flag为1,否则为0。
文学研究助手
题目:文学研究助手【问题描述】文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
【基本要求】英文小说存放于一个文本文件中。
待统计的词汇集合要依次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
【选作内容】(1)模式匹配要基于KMP算法(2)整个统计过程中只对小说文字扫描一遍以提高效率实验完成情况:②作内容与基本要求都已完成。
②附加了二个功能:算出了所查询的关键词在其出现行的具体位置和在此行出现的次数。
③序共达376行。
程序特色之处:A、用了KMP算法,大大提高了运算速率B、熟练且灵活地运用了链表知识C、熟练且灵活地运用了结构体知识概要设计:【抽象数据类型定义】ADT数据对象:英文字母、空格和标点符号的集合数据关系:其集合构成一篇可读性的文章基本操作:InitList(&L)操作结果:构造一个空链表;InitList_node(&L)操作结果:构造一个总链表里的分链表;copy( &T, chars) (&L)初始条件:已知chars 操作结果:chars数组中的字符付给T.ch;并计算出chars 的长度赋给T.lengthCreateNode(&sl, str)这个函数建立的是总链表里面的结点初始条件:已知str操作结果:建立sl结构体中某要素的节点,并将str相应值赋值给slCreateNode_node (&sl, str)这个函数建立的是总链表里面分链表的结点初始条件:已知str 操作结果:建立sl结构体中某要素的节点,并将str相应值赋值给sladdnode(&ls, link)这个函数建立的是总链表初始条件:已知ls和link 操作结果:将link附加到ls后面add_node(&ls, link)这个函数建立的是总链表里分链表初始条件:已知ls和link 操作结果:将link附加到ls后面Index_KMP (s, t, pos)初始条件:已知字符串s,t 操作结果:找出s中与t相同的开始位置IsNotCharactor(ch)初始条件:已知字符ch操作结果:判断ch是否为英文字母ShowList_node(L)初始条件:已知一个链表的头结点操作结果:将链表的中信息打印出来,并将链表的某些信息再传递下去ShowList(L)初始条件:已知L的相关信息操作结果:打印出L的相关信息find(&stringLinkList, hstrLine, row)初始条件:已知stringLinkList, hstrLine, row操作结果:在串数据链表stringLinkList,读出查找的串strkey,与传入的串hstrLine匹配如果成功将匹配的次数与行数row,写入相对应的行行数据链表Next(s, j)初始条件:已知s,j操作结果:KMP模式匹配的next函数,即找出自身匹配Count_KMP(s, t, pos)初始条件:已知字符串s和t,pos操作结果:求串t在s中出现的次数程序使用说明A.输入正确的打开文件方式,例如:h:\code.txtB.输入所要查询的单词,每输入一个单词就按回车,并最后以符号“#”结束、【程序模块调用关系】A 结构体调用情况整个结构体框架主要以建立两层链表为主体。
数据结构实验题目
实验题目一一、单链表基本运算【问题描述】设计并实现线性表的单链表存储和运算。
【基本要求】实现单链表的插入、删除和遍历运算,每种操作用一个函数实现。
插入操作:将一个新元素插入表中指定序号的位置。
删除操作:将指定序号的元素从表中删除。
遍历操作:从表头按次序输入所有元素的值,若是空表,则输出信息“empty list!”。
【实现提示】程序运行时,首先在main函数中创建空的、带头结点的单链表。
然后多次调用实现插入操作的函数(每次都将元素在序号1位置上插入),将元素依次插入表中,最后调用实现遍历操作的函数输出所有元素。
之后再多次调用实现删除操作的函数将表还原为空表(每次都删除第1个元素,每删除一个元素后,将表中剩余元素都输出一次)。
【测试数据】输入数据:1 2 3 4 5 0(为0时结束,0不存入链表)第一次输出:5 4 3 2 1第二次输出:4 3 2 1第三次输出:3 2 1第四次输出:2 1第五次输出:1第六次输出:empty list!二、约瑟夫环问题【问题描述】编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。
报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。
【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】M的初始值为20;n等于7,7个人的密码依次为:3,1,7,2,4,8,4。
输出为:6,1,4,7,2,3,5【实现提示】程序运行时,首先要求用户指定初始报数上限值,然后读取各人的密码。
可设n≤30。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
【选作内容】用顺序存储结构实现该题目。
三、一元多项式相加、减运算器【问题描述】设计一个一元稀疏多项式简单计算器。
数据结构报告
数据结构报告数据结构报告一、概述数据结构是计算机科学中的一个重要领域,它研究数据的组织、存储、管理和操作方法。
在计算机程序设计中,数据结构的选择往往直接影响到程序的效率和运行速度。
因此,深入理解和掌握数据结构对于编写高质量的程序至关重要。
二、常见数据结构1. 数组(Array):连续存储的数据结构,按照顺序访问。
2. 链表(Linked List):由节点组成的线性数据结构,每个节点包含数据和指向下一个节点的指针。
3. 栈(Stack):一种先进后出(Last In First Out)的数据结构,只能在表尾进行插入和删除操作。
4. 队列(Queue):一种先进先出(First In First Out)的数据结构,只能在表头进行删除操作,在表尾进行插入操作。
5. 树(Tree):由节点和边组成的非线性数据结构,每个节点最多有两个子节点。
6. 图(Graph):由节点和边组成的非线性数据结构,节点间可以有多个连接关系。
7. 堆(Heap):一种特殊的树形数据结构,每个节点的值都大于(或小于)其子节点的值。
8. 散列表(Hash Table):通过散列函数将键映射到一个固定大小的表中,用于快速查找数据。
三、数据结构的选择在实际程序设计中,需要根据具体的场景和需求选择合适的数据结构,以提高程序的效率和性能。
例如,对于需要频繁进行插入和删除操作的情况,链表和队列可能是更好的选择;而对于需要快速查找数据的情况,散列表和二叉搜索树可能更适合。
四、数据结构的应用数据结构在计算机科学和工程领域有广泛的应用,如算法设计、数据库系统、编译器设计、图形图像处理等。
不同的数据结构可以用于解决不同的问题,例如树可以用于实现文件系统的目录结构,散列表可以用于实现数据库的索引等。
五、总结数据结构是计算机科学的基础知识之一,掌握数据结构对于编写高效的程序是非常重要的。
通过选择合适的数据结构可以提高程序的效率和性能,使程序更加稳定和可靠。
数据结构 实验报告
数据结构实验报告数据结构实验报告一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到数据的存储、组织和管理等方面。
通过实验学习,我们可以更好地理解和掌握不同的数据结构,提升我们在编程中解决实际问题的能力。
二、实验目的本次实验的主要目的是通过实际操作,加深对数据结构的理解,学习并掌握不同数据结构的特点和应用场景,提高编程能力。
三、实验内容1. 实验环境的搭建在开始实验之前,我们需要搭建相应的实验环境。
首先,我们选择合适的集成开发环境(IDE),如Eclipse或IntelliJ IDEA,并安装好Java Development Kit(JDK)。
然后,根据实验要求,下载并安装相应的数据结构库或框架。
2. 实验一:线性表线性表是最基本且最常用的数据结构之一,它可以用于存储一系列具有相同数据类型的元素。
实验中,我们需要实现一个线性表的基本操作,包括插入、删除、查找、修改等。
3. 实验二:栈和队列栈和队列是两种常用的数据结构,它们都是线性表的衍生结构,但在操作上有一些特殊的限制。
实验中,我们需要实现栈和队列的基本操作,并比较它们在不同场景下的优劣。
4. 实验三:树和二叉树树是一种非线性的数据结构,它以分层的方式存储数据。
二叉树是树的一种特殊情况,其中每个节点最多只有两个子节点。
实验中,我们需要实现树和二叉树的构建和遍历算法,并掌握它们在实际问题中的应用。
5. 实验四:图图是一种非线性的数据结构,由节点和边组成。
实验中,我们需要实现图的构建和遍历算法,并应用它们解决实际的图相关问题。
四、实验结果与分析通过实验,我们得到了以下结果和分析:1. 在线性表实验中,我们成功实现了插入、删除、查找和修改等基本操作,并验证了其正确性和效率。
2. 在栈和队列实验中,我们对比了它们在不同场景下的应用,发现栈适用于后进先出(LIFO)的情况,而队列适用于先进先出(FIFO)的情况。
3. 在树和二叉树实验中,我们掌握了树和二叉树的构建和遍历算法,并应用它们解决了一些实际问题,如树形结构的存储和搜索。
文学研究助手数据结构报告
文学研究助手数据结构报告武汉理工大学华夏学院课程设计课程名称数据结构题目文学研究助手______ 年____ 月 ____ 日文学研究助手设计目的(1 )使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握数据库设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生学会使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
问题描述文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
基本要求英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计算法思想本次课程设计使用的是串模式匹配的KMP算法,模式匹配算法KMP为普通模式匹配的改进,优点在与时间复杂度由原来的O(n*m)变为0(n+m),即是说统计时间大大缩短。
当要统计的词汇量很大时,计算机统计所需时间将很漫长,如果使用者急需使用统计结果,这是又因为统计太慢导致研究受阻,这样就得不偿失了。
而本程序将大大改善这种状况,让计算机在短时间内统计出使用者想要的统计结果。
本程序虽然精简,但是对模式匹配算法KMP勺使用极其灵活,需灵活调用模式匹配算法KMP的函数来快速解决问题。
该算法的核心思想是:每当一趟匹配过程中出现字符比较不等时,不需要回测指针,而是利用已经得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。
模块划分本次课程设计所用到的程序主要包含四个模块,分别是主程序模块、有序表单元模块、单词单元模块和单词文本串文件单元模块。
其中主程序模块需要实现的功能是,输入文本并统计文件中每个需要测试的单词出现的次数和位置,并输出结果。
源程序#i nclude <stdio.h>#include <stdlib.h>#defi ne MAXSTRLEN 255 // 最大串长typedef char SStri ng[MAXSTRLEN+1];intnext[MAXSTRLEN]; //KMP 算法中用到的nextint In dex(SStri ng S,SStri ng T,i nt pos) //KMP 算法{int i=pos,j=1;while(i<=S[0]&&jv=T[0])if(j==O||S[i]==T[j]) {++i;++j;}elsej=n ext[j];if (j>T[O]) return (i-T[O]);elsereturn 0;int len th(SStri ng str) // int i=1;while(str[i]) i++;return(i-1);void fin d(char n ame[],SStri ng keys) // SStri ng text; // 用于存放从小说文件读取的一行字符串求串长查找函数int i=1,j=0,k,q=0; //i 用于存放行号, j 用于存放列号,k 用于输出格式的控制,q 用于统计出现次数FILE *fp;if (!(fp=(fope n(n ame,"r")))) // 打开小说文件printf ("打开文件出错!\n");exit(0);text 串中if (j!=0)i++; II 行号加1,在下一行中寻找q+=k; //累加k 以统计关键字出现次数printf("%s 出现 %d 次。
数据结构实验报告
数据结构实验报告摘要:本实验是针对数据结构概念与应用的课程要求进行的,主要目的是通过实践掌握各种数据结构的基本操作和应用场景。
在实验中,我们学习了线性表、栈、队列、二叉树等数据结构,并实现了它们的各种操作。
通过实验,我们深入理解了数据结构的原理和应用,并且掌握了如何在实际项目中应用各种数据结构来解决问题。
1. 引言数据结构是计算机科学中的一个重要概念,它研究如何组织和存储数据以及如何在这些数据上进行操作。
它对于算法的设计和优化起着至关重要的作用。
本次实验旨在通过实践,加深对数据结构的理解,并掌握其基本操作和应用场景。
2. 实验目的本实验的主要目的是:(1) 理解线性表、栈、队列和二叉树等数据结构的概念和特点;(2) 掌握各种数据结构的基本操作,如插入、删除、查找等;(3) 学会在实际项目中应用各种数据结构,解决实际问题。
3. 实验工具本实验使用的工具有:(1) 编程语言:C++;(2) 集成开发环境:Visual Studio;(3) 相关库:标准模板库(STL)。
4. 实验内容和步骤4.1 线性表线性表是最基本的数据结构之一,它包括顺序表和链表两种形式。
在本实验中,我们实现了一个基于顺序表的线性表。
具体步骤如下:(1) 定义线性表的数据结构和基本操作函数;(2) 实现线性表的初始化、插入、删除、查找、修改等基本操作;(3) 编写测试代码,验证线性表的功能和正确性。
4.2 栈栈是一种特殊的线性表,它遵循先进后出(LIFO)的原则。
在本实验中,我们实现了一个基于数组的栈。
具体步骤如下:(1) 定义栈的数据结构和基本操作函数;(2) 实现栈的初始化、入栈、出栈、查看栈顶元素等基本操作;(3) 编写测试代码,验证栈的功能和正确性。
4.3 队列队列是另一种特殊的线性表,它遵循先进先出(FIFO)的原则。
在本实验中,我们实现了一个基于链表的队列。
具体步骤如下:(1) 定义队列的数据结构和基本操作函数;(2) 实现队列的初始化、入队、出队、查看队首元素等基本操作;(3) 编写测试代码,验证队列的功能和正确性。
数据结构编程——文字研究助手
#include<stdio.h> #include<stdlib.h>#include<string.h>typedef char String[10];typedef struct LNode{//用链表存储关键字所在的行数int data;//第几行的行数struct LNode *next;//指向下一个出现该关键字的行数}LNode,*LinkList;// 表示单链表节点的结构体typedef struct{String name;//关键字的名称int geshu;//关键字的个数LNode q;//指向关键字所在的行数的链表LNode *qq;}GUAN;int index(String t,char msg[],int pos){//此函数返回子串t在主串msg中从第pos个字符开始的位置//要求msg非空,1<=pos<=strlen(t)if((0<=pos)&&(pos<=(strlen(msg)-strlen(t)))){int i=pos,j=0;while((i<=strlen(msg)-1)&&(j<=strlen(t)-1)){if(msg[i]==t[j]){++i;++j;}else{i=i-j+1;j=0;}}if(j>strlen(t)-1)return (i+1); //返回模式匹配结束的那个位置,即匹配的最后一个字符所在的位置return 0;//否则返回0}else return -1;}int main(){FILE *fp=fopen("input.c","r");if(fp==NULL){printf("open input file fail\n");return 1;}int i;GUAN *p=(GUAN *)malloc(32*sizeof(GUAN));strcpy(p[0].name,"auto");strcpy(p[1].name,"break");strcpy(p[2].name,"case");strcpy(p[3].name,"char");strcpy(p[4].name,"const");strcpy(p[5].name,"continue");strcpy(p[6].name,"default");strcpy(p[7].name,"do");strcpy(p[8].name,"double");strcpy(p[9].name,"else");strcpy(p[10].name,"enum");strcpy(p[11].name,"extern");strcpy(p[12].name,"float");strcpy(p[13].name,"for");strcpy(p[14].name,"goto");strcpy(p[15].name,"if");strcpy(p[16].name,"int");strcpy(p[17].name,"long");strcpy(p[18].name,"register");strcpy(p[19].name,"return");strcpy(p[20].name,"short");strcpy(p[21].name,"signed");strcpy(p[22].name,"static");strcpy(p[23].name,"sizeof");strcpy(p[24].name,"struct");strcpy(p[25].name,"switch");strcpy(p[26].name,"typedef");strcpy(p[27].name,"union");strcpy(p[28].name,"unsigned");strcpy(p[29].name,"void");strcpy(p[30].name,"volatile");strcpy(p[31].name,"while");int xx;for(xx=0;xx<32;xx++){p[xx].geshu=0;p[xx].q.next=NULL;p[xx].qq=&(p[xx].q);}//至此,初始化工作完成LNode *r=(LNode *)malloc(32*sizeof(LNode));for(xx=0;xx<32;xx++){r->next=&(p[xx].q);r++;}r=r-32;LNode *m;for(i=1;i<=1000;i++){char msg[300];char *iop;while((iop=(fgets(msg,300,fp)))!=NULL){for(xx=0;xx<32;xx++){//在这一行中对每个关键字一个一个进行匹配if(index(p[xx].name,msg,0)==0)r++;//这一行没有此关键字else if(index(p[xx].name,msg,0)!=-1){int x=0,y=0;for(;(index(p[xx].name,msg,x)!=-1)&&(index(p[xx].name,msg,x)!=0)&&((msg[index(p[xx].name ,msg,x)-1]>'z')||(msg[index(p[xx].name,msg,x)-1]<'a'))&&((msg[index(p[xx].name,msg,x)-strlen( p[xx].name)-2]>'z')||(msg[index(p[xx].name,msg,x)-strlen(p[xx].name)-2]<'a'));x=index(p[xx].na me,msg,x))y++;//第i行,共y个相同的某个关键字p[xx].geshu+=y;//将这一行的关键字个数存入p->geshu中进行累加//用表尾插入法将这一行的行号存入单链表中if(y!=0){m=(LNode *)malloc(sizeof(LNode));m->data=i;m->next=NULL;p[xx].qq->next=m;p[xx].qq=m;}r++;}//这一行的这个关键字的检索与记录完毕else r++;//这一行没有此关键字//进行下一个关键字的检索}//检索直至这一行所有关键字的检索完毕r=r-32;break;}if(iop==NULL)break;}fclose(fp);//下面进入打印输出阶段for(xx=0;xx<32;xx++){if(p[xx].geshu!=0){printf("%s %d",p[xx].name,p[xx].geshu);p[xx].qq=r->next;while(p[xx].qq->next!=NULL){printf(" %d",p[xx].qq->next->data);p[xx].qq=p[xx].qq->next;}printf("\n");}r++;}system("pause");return 0; }。
数据结构试验报告-文学研究报告助手
实验报告:文学研究助手题目:编写一个统计特定单词在文本中出现的次数和位置的程序一、需求分析1.文本串非空并以文件的形式存放在根目录中,统计匹配的词非空。
文件名和需要匹配的词集均有用户从键盘输入;2.单词都是由某种类型字符的序列组成,如字母字符序列(区分大小写)、数值常数(整数或小数型实数)字符序列, 界符(分隔符(‘(’,‘)’,‘,’等)、运算符等(‘+’,‘-’,‘*’,‘/’等)可独立构成单词,中间不含空格并且区分大小写;3.待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;4.在计算机终端输出的结果是:单词,出现的次数,出现的位置所在行的行号,若一个单词在同一行出现多次只输出一个行号;5.测试数据:本次实验中的文本文件是LiteratureAssitant.cpp;待统计的词集为:If char int else for return void二、概要设计:1. 定义“单词”类型:ADT Aword{数据对象:D={Si | Si ∈标准c字符串集合,i = 1,2,3,…….,n,n ≥0}数据关系:R1={<Si-1,Si>} | Si-1,Si ∈D,i = 1,2,3,…..,n}基本操作:NewWord(WordType *nw,Sequence cha)初始条件:cha为字符序列;操作结果:生成一个其值为给定字符序列的单词;WordCmp(WordType wd1,WordType wd2)初始条件:单词wd1和单词wd2已存在;操作结果:若wd1<wd2,则返回-1;若wd1=wd2,则返回0;若wd1>wd2,则返回1;PrintWord(WordType wd)初始条件:单词wd已存在;操作结果:在计算机终端上显示单词wd;}ADT AWord2. 定义有序表类型:ADT OrderList{数据对象:D={Si | Si ∈AWord,i = 1,2,3,…….,n,n ≥0}数据关系:R1={<Si-1,Si>} | Si-1,Si ∈D,Si-1<S,i = 1,2,3,…..,n}基本操作:InitList(OrderList *L)操作结果:构造一个空的有序表;DestroyList(OrderList *L)初始条件:有序表L已存在;操作结果:销毁L的结构,并释放所占空间;LocateElem(OrderList L,ElemType e,LinkType *q)初始条件:有序表L已存在;操作结果:若有序表L中存在元素e,则q指示L中第一个值为e的元素的位置,并返回函数值FRUE;否则q指示第一个大于e的元素的前驱的位置,并返回函数值FALSE;InsertAfter(OrderList *L,LinkType q,LinkType s)初始条件:有序表L已存在,q指示L中一个元素;操作结果:在有序表L中q指示的元素之后插入元素s;Listpare(OrderList La,OrderList Lb,EqelemList *s)初始条件:有序表La和Lb已存在;操作结果:以s返回其中相同元素;}ADT OrderList3. 定义单词文本串文件类型如下:ADT TextString{数据对象:D={Si | Si ∈标准c字符集,i = 1,2,3,…….,n,n ≥0};数据关系:D中字符被“换行符”分割成若干行,每一行的字符间满足下列关系:R1={<Si-1,Si>} | Si-1,Si ∈D,i = 1,2,3,…..,n}基本操作:Initialization(FILE **fr)初始条件:文件fr已存在;操作结果:打开文件fr,设定文件指针指向文件中第一行第一个字符;GetAWord(FILE *f,Sequence *st)初始条件:文件f已打开;操作结果:从文件指针所指字符起提取一个“单词st”;ExtractWord(FILE *f,OrderList *ta)初始条件:文件f已打开,文件指针指向文件f中某一行的第一个字符;操作结果:提取该行中所有单词,并构成单词的有序表ta,本操作结束时,文件指针指向文件f中下一行的第一个字符;match(FILE *f,OrderList pat,ResultType rs)初始条件:文件f已打开,文件指针指向文件f中第一个字符;pat为包含所有待查询单词的有序表;操作结果:rs为查询结果;}ADT TextString4. 本程序包含四个模块:1)主程序模块:主函数设计如下int main ( ) {输入信息和文件初始化;生成测试目标词汇表;统计文件中每个待测单词出现的次数和位置;输出测试结果;};2)单词单元模块-------实现单词类型;3)有序表单元模块--------实现有序表类型;4)单词文本串文件单元模块------实现文本串文件类型;5、存储结构及存储映像为:6、函数的调用关系为:mainInitialization InputWord ListEmpty InitRList OutResult match DestroyList InitList MakeNode NewWord WordCmp InsertAfter PrintWordMakeNode CopyWord ExtractWord Listpare NewLengthFelon GetAWord MakeNode InsertAfter 三、详细设计:// LiteratureAssitant.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdafx.h"// LiteratureAssitant.cpp : 定义控制台应用程序的入口点。
数据结构分析报告
数据结构分析报告在当今数字化的时代,数据结构成为了计算机科学和信息技术领域中至关重要的概念。
无论是开发复杂的软件应用,还是处理海量的数据,理解和正确选择合适的数据结构都是关键所在。
数据结构,简单来说,就是数据的组织和存储方式,它决定了数据的访问、插入、删除和修改等操作的效率。
不同的数据结构具有不同的特点和适用场景,就像我们在不同的情况下会选择不同的工具来完成任务一样。
让我们先来谈谈数组。
数组是一种线性的数据结构,它将相同类型的元素按顺序存储在连续的内存空间中。
这使得数组在随机访问元素时非常高效,因为可以通过索引直接计算出元素的内存地址。
例如,如果要获取数组中的第 5 个元素,只需要通过一个简单的计算就能快速定位到它。
然而,数组的缺点也很明显。
当需要插入或删除元素时,特别是在中间位置,就需要移动大量的元素,这会带来较大的时间开销。
所以,数组适用于元素数量相对固定,且频繁进行随机访问的场景。
链表则与数组截然不同。
链表中的元素在内存中不一定是连续存储的,每个元素(节点)包含数据部分和指向下一个节点的指针。
链表在插入和删除元素方面表现出色,因为只需要修改相关节点的指针即可,无需移动大量元素。
但链表的随机访问效率较低,要访问特定位置的元素,必须从头节点开始顺着指针逐个遍历,直到找到目标节点。
因此,链表常用于频繁进行插入和删除操作,而对随机访问需求较少的情况。
栈是一种特殊的线性结构,它遵循“后进先出”的原则。
想象一下一叠盘子,最后放上去的盘子总是最先被拿走,这就是栈的工作方式。
栈在函数调用、表达式求值、回溯算法等方面有着广泛的应用。
例如,在编程语言中,函数的调用就是通过栈来实现的,每个函数的执行环境都会被压入栈中,当函数返回时再从栈中弹出。
队列则遵循“先进先出”的原则,就像排队买票一样,先来的人先得到服务。
队列在任务调度、消息缓冲、广度优先搜索等场景中发挥着重要作用。
例如,操作系统中的打印任务队列,先进入队列的打印任务会先被处理。
文学研究助手课程设计报告
文学研究助手课程设计报告书1 问题描述文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
实现这一目标的文字统计系统,称为“文学研究助手”。
其中,英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
2 注意事项1 文本串为非空,以文件的形式存放,统计匹配的词集非空,文件名和词集均由用户输入。
2 单词是字母构成的序列,并且区分大小写,且中间不应有空格。
3 为了操作的简便,单词在原文本中不出现换行的情况。
4 计算机终端输出的格式是:单词,次数,行号,同一行出现两次,只输出第一次的。
3 设计3.1 存储结构设计1 char articles[MAXSIZE] (定义一个全局数组,用于从文件中读取字符依次放入此字符串中。
以便进行此后的操作)。
2 struct HString{char* words;int length;int* next;int count;int j;};(定义此结构体类型,其中words指针用来指代存储输入检测单词的空间的头指针,length用来表示该检测单词的长度,count用来存储每个单词的出现次数,j用来表示从该单词的零位置开始检测,为下面的KMP算法提供方便)。
3 void wenjianfuzhi(char articles[]){FILE *p,*q;char ch;int i=0;p=fopen("dage.txt","w");if(p==NULL){exit(-1);}while(scanf("%c",&ch)!=EOF)putc(ch,p);fclose(p);q=fopen("dage.txt","r");if(q==NULL){exit(-1);}while((ch=getc(q))!=EOF){articles[i]=ch;i++;}fclose(q);system("pause");}(本函数之中,首先以写的方式打开一个叫做“dage.txt”的文本文件,让后依次向其中输入数据,让后再以读的方式,将文件中的内容给全局数组,本段程序中是将原来的文章,存入事先开辟的一个文件“dage.txt”中来).3.2 算法设计(流程图)本次实验,为了使程序的效率更高,使用了串模式匹配的KMP算法,该算法的核心思想是:每当一趟匹配过程中出现字符比较不等时,不需要回测指针,而是利用已经得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。
实验报告(实验四文学研究助手)
实验报告(实验四文学研究助手)韶关学院学生实验报告册实验课程名称:数据结构与算法实验项目名称:实验四串及其应用文学研究助手实验类型(打? ):(基础、综合、设计? )院系:信息工程学院计算机系专业:*****姓名:*** 学号:*****指导老师:陈正铭韶关学院教务处编制一、实验预习报告内容预习日期:2007年 5 月 8日实验预习报告内容原则上应包括实验目的、实验所用的主要仪器药品、实验原理与公式、实验预习疑问等项目。
【实验目的】熟悉串类型的实现方法和文本模式匹配的方法,熟悉一般文字处理软件的设计方法以及较复杂问题的分解求精方法。
【需要分析】文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
写一个实现这一目标的文字统计系统,称为“文学研究助手”。
【软件平台】Windows 2000,Visual C,, 6.0或WINTC【概要设计】参看《数据结构题集》P123【疑问】单链表中是否设头结点好,(这部分内容因人而异,也可不写)实验预习评分:二、实验原始(数据)记录实验时间: 2007 年 5 月 16 日(星期三第7,8 节) 实验同组人 :如有实验实验数据表格,学生在实验预习时应画好实验数据表格,供实验填写数据。
参看《数据结构题集》P134用源程序测试,把源程序重命名为“test.cpp”,存放于c盘根目录,运行程序,结果如下:请输入要搜索的文本(输入格式为:文本的存放路径\文本名.扩展名)c:\test.cpp请输入要搜索的单词(英文单词),如果是'#'则表示输入结束statusinttypedefifcout#搜索结果:status:出现的次数13;10,17,40,49,55,62,71,103,112,121,127,140,196行int :出现的次数11;10,15,19,20,25,27,79,91,96,143,149行typedef:出现的次数7;10,11,12,33,37,90,94行if :出现的次数9;28,42,105,114,151,153,154,184,198行cout :出现的次数18;43,96,106,115,118,130,152,179,183,184,188,191,199,200,211,21 8,222行是否继续进行搜索(Y/N)经测试,结果正确。
数据结构实验报告
数据结构实验报告树是一种非线性的数据结构,它由节点和边组成,节点之间存在层次关系。
树的应用十分广泛,特别是在存储和检索数据上。
在本次实验中,我对树的应用进行了研究和实践,并撰写了本篇实验报告。
本次实验中,我首先学习了树的基本概念和相关术语。
树由根节点、子节点、叶节点以及它们之间的连接边组成。
每个节点可以有多个子节点,但只能有一个父节点(除了根节点)。
叶节点是没有子节点的节点。
这种层次结构使得树可以用来表示具有层次关系的数据,例如家谱、目录结构等。
接下来,我学习了树的不同种类和它们的特点。
最常见的树结构包括二叉树、二叉树(BST)、平衡二叉树、AVL树等。
二叉树是一种每个节点最多有两个子节点的树结构。
二叉树是二叉树的一种特殊形式,其中左子树的所有节点值都小于根节点的值,右子树的所有节点值都大于根节点的值。
平衡二叉树是一种高度平衡的二叉树,它的左右子树的高度差不超过1、AVL树是一种自平衡的二叉树,它通过旋转和重新平衡来保持树的平衡性。
为了更好地理解树的应用,我选择了二叉树(BST)作为本次实验的主要研究对象。
BST是一种高效的数据结构,可以用来存储一组有序的数据,并且支持快速的查找、插入和删除操作。
我首先实现了BST的基本操作,包括插入节点、删除节点和查找节点。
通过这些操作,我可以在BST中存储和检索数据。
在插入节点时,我按照BST的特性将节点插入到相应的位置,并保持树的有序性。
在删除节点时,我考虑了不同的情况,包括删除叶节点、删除只有一个子节点的节点以及删除有两个子节点的节点。
在查找节点时,我使用了递归的方式在树中查找节点的值。
接着,我实现了一些BST的扩展操作。
首先是中序遍历,它可以按照节点的值的升序输出BST中的所有节点。
其次是最小值和最大值的查找,它们分别返回BST中的最小值和最大值。
最后是查找一些节点的前驱和后继,前驱是小于该节点的最大节点,后继是大于该节点的最小节点。
这些扩展操作可以进一步提升BST的功能和灵活性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计
课程名称数据结构
题目文学研究助手
专业
班级
姓名__ _ _____
成绩____________________
年月日
文学研究助手
设计目的
(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握数据库设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生学会使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
问题描述
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
基本要求
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
算法思想
本次课程设计使用的是串模式匹配的KMP算法,模式匹配算法KMP为普通模式匹配的改进,优点在与时间复杂度由原来的O(n*m)变为O(n+m),即是说统计时间大大缩短。
当要统计的词汇量很大时,计算机统计所需时间将很漫长,如果使用者急需使用统计结果,这是又因为统计太慢导致研究受阻,这样就得不偿失了。
而本程序将大大改善这种状况,让计算机在短时间内统计出使用者想要的统计结果。
本程序虽然精简,但是对模式匹配算法KMP的使用极其灵活,需灵活调用模式匹配算法KMP的函数来快速解决问题。
该算法的核心思想是:每当一趟匹配过程中出现字符比较不等时,不需要回测指针,而是利用已经
得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。
模块划分
本次课程设计所用到的程序主要包含四个模块,分别是主程序模块、有序表单元模块、单词单元模块和单词文本串文件单元模块。
其中主程序模块需要实现的功能是,输入文本并统计文件中每个需要测试的单词出现的次数和位置,并输出结果。
源程序
#include <stdio.h>
#include <stdlib.h>
#define MAXSTRLEN 255 //最大串长
typedef char SString[MAXSTRLEN+1];
int next[MAXSTRLEN]; //KMP算法中用到的next
int Index(SString S,SString T,int pos) //KMP算法
{
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j]) {++i;++j;}
else
j=next[j];
}
if (j>T[0]) return (i-T[0]);
else
return 0;
int lenth(SString str) //求串长
{
int i=1;
while(str[i]) i++;
return(i-1);
}
void find(char name[],SString keys) //查找函数
{
SString text; //用于存放从小说文件读取的一行字符串
int i=1,j=0,k,q=0; //i用于存放行号,j用于存放列号,k用于输出格式的控制,q 用于统计出现次数
FILE *fp;
if (!(fp=(fopen(name,"r")))) //打开小说文件
{
printf("打开文件出错!\n");
exit(0);
}
keys[0]=lenth(keys); //求关键字的长度
printf("\n%s\n",&keys[1]); //打印关键字
while (!feof(fp)) //如果还没到小说文件末尾,则继续循环
{
k=0;
fgets(&text[1],MAXSTRLEN,fp); //从小说文件中读取一行字符串,存入text串中
text[0]=lenth(text); //求读入的串的长度
j=Index(text,keys,j+1); //调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0
if (j!=0)
{printf("行=%d,列=%d",i,j); k++;} //若匹配成功则打印行号和列号
while(j!=0) //若该行找到了关键字,则继续寻找看是否还能匹配成功
{
j=Index(text,keys,j+1); //调用KMP算法从刚找到的列号后一字符起匹配
if (j!=0)
{printf(",%d",j);k++;} //若匹配成功,则打印列号
}
i++; //行号加1,在下一行中寻找
q+=k; //累加k以统计关键字出现次数
if (k) printf("\n"); //输出格式控制
}
printf("%s出现%d次。
\n",&keys[1],q); //打印关键字出现次数
}
void main()
{
char name[50]; //存储输入的小说路径字符串
SString words[10]; //定义字符串数组,用于存储输入的关键字
int m,n,i;
printf("----------------------欢迎使用文学研究助手--------------------");
//打印标题
while(1) //不停循环,直至完成查询或者退出服务
{
printf("是否需要为你服务:需要输入1,不需要输入0。
\n");
scanf("%d",&m); //输入判断是否需要服务
if(m==1) //需要服务时执行
{
printf("输入你想查询的文档名字:\n");
scanf("%s",name); //输入文件名
printf("输入查询字符串的个数:\n");
scanf("%d",&n); //输入查询字符串个数
printf("输入你要查询的字符串:\n");
for (i=0;i<n;i++)
scanf("%s",&words[i][1]); //用户一次性输入要查找的关键字,words[i][0]用于存放字符串的长度
for (i=0;i<n;i++)
find(name,words[i]); //对于每一个关键字,调用查找函数进行查找统计
break;
}
else if(m==0) //不需要服务时执行
break;
else
printf("输入错误!\n\n"); //输入不合规范时执行}
system("pause");
}
程序测试
将所设计的程序输入c++软件,经组建编译后结果如下:
程序能正常编译,说明程序没有问题。
程序运行结果如下:
程序能够正常运行,各功能也能正常实现。
总结和体会
通过本次课程设计,我掌握了数据结构的应用、算法的编写等基本方法,并学会了如何设计完整的程序,利用数据结构设计程序来解决问题。
本次课程设计中,使用的算法主要为KMP算法,程序的执行流程大概为,先输入文章到文件中去,在将文件中的文章付给全局数组,然后输入你想测试的单词个数,然后在输入测试的单词,最后用KMP算法进行模式匹配。
在编写程序的过程中,我遇到了一些问题,在翻阅资料以及请教同学后,终于完整的设计出这个程序。
在程序中,尽量注释每个语句的含义,这样既方便别人查看程序,也方便自己能够快速发现程序中出现的问题,并及时改正。
本次课程设计,对我来说收获颇多。
它不仅让我巩固了所学的数据结构这门课程里的一些知识,还能够自己去设计一些简单的程序,并能够运用所学的知识去解决一些实际问题。