中南大学数据结构试验报告题目实验三学生姓名王云鹏学号8213180228指导老师郑瑾学院计算机学院专业班级物联网1802完成时间2020.6指导老师评定签名实验三1.需求分析本实验的目的是使读者熟悉串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法,较复杂问题的分解求精方法,在实验二的基础上,进一步强化这样一个观念:程序是数据结构结合定义在其上的操作。此外还希望起到训练合作能力和熟悉文件操作的目的。本实验的难度较大。1.文学研究助手(设计性实验)问题描述文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统,称为“文学研究助手”。基本要求英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置的行号,格式自行设计。测试数据以源程序模拟英文小说,编程语言保留字集作为待统计的词汇集。实现提示设小说非空且以文件形式存放,其中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数和出现位置的行号,后者可以用链表存储。若某行中出现了不止一次,不必存多个相同的行号。数据结构采用二维链表,单词结点链接成一个链表,每个单词的行号组成一个链表,单词结点作为行号链表的头结点。选作内容(1)模式匹配要基于KMP算法。(2)整个统计过程中只对小说文字扫描一遍以提高效率。(3)假设小说中的每个单词或者从行首开始,或者前置以一个空格符。利用单词匹配特点另写一个高效的统计程序,与KMP算法统计程序进行效率比较。(4)推广到更一般的模式匹配问题,并设待查模式串可以跨行思考题怎样考虑分词问题?怎样考虑多模式匹配问题?2.简单行编辑程序(综合性实验)问题描述文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济也不总能实现。一种解决方法是逐段地编辑,任何时刻只把待编辑文件的一段放在内存,称为活区。试按照这种方法实现一个简单的行编辑程序。设文件每行不超过320个字符,并且很少超过80字符。基本要求实现以下4条基本编辑命令。(1)行插入。格式:i行号回车文本回车。将文本>插入活区中第行号>行之后。(2)行删除。格式:d行号1[□行号2]回车。删除活区中第行号1>行(到第行号2>行)。两种格式的例子如“d10↙”和“d10□14↙”。(3)活区切换。格式:n回车。将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p回车。逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后各页(如果存在)。印出的每一行要包含该行的行号和一个空格符,行号固定占4位,增量为1。各条命令中的行号均须在活区中各行行号范围之内,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。测试数据由读者依据软件工程的测试技术自己确定。注意测试边界数据,如首行、尾行。实现提示(1)设活区的大小用行数activemaxlen(可设为100)来描述。考虑到文本文件行长通常为正态分布,且峰值为60~70,用320×activemaxlen大小的字符数组实现存储将造成大量浪费。可以以标准行块为单位为各行分配存储,每个标准行块含81个字符。这些行块可以组成一个数组,也可以利用动态链表连接起来。一行文字可能占多个行块。行尾可用一个特殊的ASCII字符(如012)标识。此外,还应记住活区起始行号,因为行插入将引起随后各行行号的顺序下推。(2)初始化过程包括请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。然后尽可能多地从输入文件中读入各行,但不超过activemaxlenx。x的值可以自定,例如20。(3)在执行行插入命令的过程中,每接收到一行时要检查活区大小是否已达到activemaxlen。如果是,则为了在插入这一行之后仍保持活区大小不超过activemaxlen,应将插入点之前活区部分的第一行输出到输出文件中。若插入点为第一行之前,则只得将新插入的这一行输出。(4)若输入文件尚未读完,活区切换命令可将原活区中最后几行留在活区顶部,以保持阅读连续性;否则,它意味着结束编辑或开始编辑另一个文件。(5)可令前3条命令执行后自动调用活区显示。选作内容(1)对于命令格式非法等一切错误做严格检查和适当处理。(2)加入更复杂的编辑操作,如对某行进行串替换、在活区内进行模式匹配等,格式可以分别为S行号@串1@串2回车和m串回车。概要设计设计性实验函数:综合性实验类:详细设计设计性实验#includestdio.h#includestdlib.h#includestring.h#definesuccess0#definefail-1typedefstructinfoin//子链信息{introw;}infoin;typedefstructnodein//子链节点{infoinrow;structnodein*next;}nodein;typedefstructinfoout//主链信息{nodein*headin;//子链头节点char*word;//主链自身信息}infoout;typedefstructnodeout//主链节点{infooutword;structnodeout*next;}nodeout;intInitout(nodeout*headout)//主链初始化{if(headout==NULL){printf(mallocfailinmainforheadout\n);returnfail;}headout-next=NULL;returnsuccess;}intlengthout(nodeout*headout)//返回主链长度{intlen=0;nodeout*p=headout;while(p!=NULL)//一直算到尾节点结束{len++;p=p-next;}returnlen-1;//不计算头节点}intlengthin(nodein*headin)//返回子链长度{intlen=0;nodein*p=headin;while(p!=NULL){len++;p=p-next;}returnlen-1;//不计算头节点}intinsertout(nodeout*headout,infooutword,intpos)//插入到主链第pos个位置{if(poslengthout(headout)+1||pos0)//非法位置{printf(illegalpositioninInsert\n);returnfail;}nodeout*p=headout;for(inti=pos;i1;i--)//找到第pos个位置{p=p-next;}nodeout*x=(nodeout*)malloc(sizeof(nodeout));//需要插入的节点if(x==NULL){printf(mallocfailinInsert);returnfail;}x-word=word;x-next=p-next;//插入链表p-next=x;returnsuccess;}intInitIn(nodein*headin)//子链初始化{if(headin==NULL){printf(mallocfailinmainforheadin\n);returnfail;}headin-next=NULL;returnsuccess;}intinsertin(nodein*headin,infoinrow,intpos)//插入到子链第pos个位置{if(poslengthin(headin)+1||pos0)//非法位置{printf(illegalpositioninInsert\n);returnfail;}nodein*p=headin;for(inti=pos;i1;i--)//找到第pos个位置{p=p-next;}nodein*x=(nodein*)malloc(sizeof(nodein));//需要插入的节点if(x==NULL){printf(mallocfailinInsert);returnfail;}x-row=row;x-next=p-next;p-next=x;returnsuccess;}intprintin(nodein*head)//打印子链{nodein*p=head;printf(thislisthasnodes:%d\n,lengthin(head));printf(thenodefromheadtotailis:\n);while(p-next!=NULL)//遍历打印{p=p-next;printf(row:%d\n,p-row.row);}returnsuccess;}intInquireout(nodeout*head,intpos,char*word[])//查询主链第pos个节点信息{if(poslengthout(head)||pos0)//非法位置{printf(illegalpositioninInquire\n);returnfail;}nodeout*p=head;for(inti=pos;i0;i--)//找到位置{p=p-next;}*word=p-word.word;returnsuccess;}intprintout(nodeout*head)//打印主链{nodeout*p=head;printf(thislisthasnodes:%d\n,lengthout(head));printf(thenodefromheadtotailis:\n);while(p-next!=NULL)//遍历打印{p=p-next;printf(word:%s\n,p-word.word);}returnsuccess;}//intmain()//{//nodeout*headout=(nodeout*)malloc(sizeof(nodeout));//Initout(headout);//nodein*headin=(nodein*)malloc(sizeof(nodein));//InitIn(headin);//infoinrow={1};//insertin(headin,row,1);//infoinrow2={2};//insertin(headin,row2,2);//printin(headin);//printf(lengthin:%d\n,lengthin(headin));//infooutword={headin,hh};//nodein*headin2=(nodein*)malloc(sizeof(nodein));//InitIn(headin2);//infooutword2={headin2,what};//insertout(headout,word,1);//insertout(headout,word2,2);//char*word_inquire;//Inquireout(headout,1,&word_inquire);//printf(word:%s\n,word_inquire);//printout(headout);//printf(lengthout:%d\n,lengthout(headout));//printin(headout-next-word.headin);//return0;//}#includelist_2d.c//literatureintgetword(char**str,char*word)//得到这个字符串str