文学研究助手(数据结构课程设计)
数据结构实验
1 线性表及其应用问题:约瑟夫环问题描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈。
每人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
基本要求:利用单向循环链表存储结构模拟此过程。
2 栈和队列及其应用题目:魔王语言解释问题描述:有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听的懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人得语言逐步抽象上去的:(1)α→β1β2…βm(2)(θδ1δ2…δn)→θδnθδn-1…θδ1θ在这两种形式中,从左到有均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听的懂的话。
基本要求:用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B→tAdA(2)A→sae3 串及其应用题目:文学研究助手问题描述:存在一篇英文文章(以串表示),以及若干关键字。
编写程序统计关键字的出现次数。
基本要求:改进KMP算法以适应多关键字匹配。
4 数组和广义表题目:数组转置问题描述:存在稀疏矩阵A,编写程序将A转置为B。
基本要求:用三元组表示稀疏矩阵,应用算法5.2完成转置。
5 树、图及其应用题目:Huffman编/译码器问题描述:使用Huffman编码进行通信可以节省通信成本。
对于双工系统而言,要求在发送端和接受端均有编码器和译码器。
试为该系统设计一个编/译码器。
基本要求:至少具有功能(1)初始化(2)编码(3)译码(4)打印代码。
6 存储管理、查找和排序题目:内部排序算法比较问题描述:通过随机数据比较各算法的关键字比较次数与移动次数。
数据结构的课程设计
数据结构的课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点与应用场景。
2. 学会分析不同数据结构的存储方式和操作方法,并能运用到实际问题的解决中。
3. 掌握排序和查找算法的基本原理,了解其时间复杂度和空间复杂度。
技能目标:1. 能够运用所学数据结构知识,解决实际问题,提高编程能力。
2. 能够运用排序和查找算法,优化程序性能,提高解决问题的效率。
3. 能够运用数据结构知识,分析并解决复杂问题,培养逻辑思维能力和创新意识。
情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。
2. 增强学生的团队协作意识,培养合作解决问题的能力,提高沟通表达能力。
3. 培养学生的抽象思维能力,使其认识到数据结构在计算机科学中的重要性,激发对计算机科学的热爱。
本课程针对高中年级学生,结合学科特点和教学要求,注重理论与实践相结合,培养学生的编程能力和逻辑思维能力。
通过本课程的学习,使学生能够掌握数据结构的基本知识,提高解决实际问题的能力,同时培养良好的学习态度和价值观。
在教学过程中,将目标分解为具体的学习成果,以便进行后续的教学设计和评估。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构(线性表、栈、队列)和非线性结构(树、图)的特点。
2. 线性表:讲解线性表的顺序存储和链式存储结构,以及相关操作(插入、删除、查找等)。
3. 栈和队列:介绍栈和队列的应用场景、存储结构及相关操作。
4. 树和二叉树:讲解树的定义、性质、存储结构,二叉树的遍历算法及线索二叉树。
5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表)、图的遍历算法(深度优先搜索和广度优先搜索)。
6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理、实现及性能分析。
7. 查找算法:介绍线性查找、二分查找等查找算法的原理及实现。
数据结构的课程设计目的
数据结构的课程设计目的一、课程目标知识目标:1. 掌握数据结构的基本概念,包括线性结构(如数组、链表、栈、队列)和非线性结构(如树、图等)的特点与应用。
2. 学会分析不同数据结构在存储和处理数据时的效率,理解时间复杂度和空间复杂度的概念。
3. 掌握常见数据结构的具体实现方法,并能够运用到实际编程中。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,能够根据问题的特点选择合适的数据结构进行优化。
2. 提高学生的编程实践能力,使其能够熟练编写与数据结构相关的程序代码,并进行调试与优化。
3. 培养学生独立思考和团队协作的能力,通过项目实践和课堂讨论,提高问题分析、解决方案的设计与实现能力。
情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学生的学习热情和主动探究精神。
2. 培养学生严谨、细致、踏实的学术态度,使其认识到数据结构在计算机科学与软件开发领域的重要性。
3. 培养学生具备良好的团队合作精神,学会倾听、沟通、表达与协作,提高人际交往能力。
课程性质:本课程为计算机科学与技术及相关专业的基础课程,旨在培养学生的数据结构知识和编程技能,提高学生解决实际问题的能力。
学生特点:学生已具备一定的编程基础,具有一定的逻辑思维能力和问题解决能力,但可能对数据结构的应用和实现方法了解不足。
教学要求:结合学生特点,课程设计应注重理论与实践相结合,以案例驱动、项目导向的教学方法,引导学生掌握数据结构知识,提高编程实践能力。
同时,注重培养学生的情感态度价值观,使其在学习过程中形成积极的学习态度和良好的团队协作精神。
通过具体的学习成果评估,确保课程目标的达成。
二、教学内容1. 线性结构:- 数组:数组的概念、存储方式、应用场景。
- 链表:单链表、双向链表、循环链表的概念及实现。
- 栈与队列:栈的概念、应用场景、实现方法;队列的概念、应用场景、实现方法。
2. 非线性结构:- 树:树的概念、二叉树、二叉查找树、平衡树(如AVL树)、堆的概念及其应用。
数据结构课程设计
第一章问题分析与任务定义1 .题目:设计一个一元稀疏多项式的简单计算器。
输入并用带表头结点的单链表存储多项式;以整数序列:n,c1,e1,c2,e2……cn,en的形式输出多项式,其中n是多项式的项数,ci,ei分别为第i项的系数和指数,序列按指数降序排列;实现多项式a、b的相加和相减操作,输出相加、相减后的多项式。
2.问题分析:符号多项式的操作,已经成为标处理的典型应用例子,多项式可由n+1个系数唯一确定,因此在计算机里可以用一个线性表来表示,每一项的指数隐含在其系数序号里,只要在结点的data域里多加一项即可,显然我们可以对该存储采取顺序存储,使得多项式相加的算法定义十分简洁,然而通常的应用里多项式的次数可能很高而且很大,使得顺序存储结构的最大长度很难确定。
这种对内存空间的浪费是应当避免的,因此若只对多项式进行求值等不改变多项式系数和指数的运算则采用类似于顺序表的顺序存储结构即可,否则采用链式存储表示比较好。
1.如何实现这种线性链表表示的多项式的加法呢?根据一元多项式的加减法运算法则:对于两个一元多项式中的所有指数相同的项,对应系数相加减,若其和不为零,则构成和或差多项式中的一项,对于两个一元多项式中的所有指数不同的向分别复抄到和火差多项式里去。
在此,按照数据类型Polynomial中的基本操作的定义,和或差多项式中的结点无需另生成,而应该从两个多项式的链表中摘取,其运算规则如下:假设指针qa和qb分别指向多项式A和B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列三种情况(1)指针qa所指结点的指数值<指针qb所指结点的指数值,则应摘取qa所致结点插入到和差多项式链表中去(2)指针qa所致结点的指数值>指针qb所指结点的指数值,则应摘取指针qb所指结点插入到和差多项式里链表中去(3)指针qa所指结点的指数值=指针qb所指结点的指数值,则将两个结点中的系数相加减,若和差数不为零,则修改qa所指结点的系数值,同时释放qb所直接点;繁殖,从多项式Adequate链表中删除相应结点,并释放指针qa和qb所致结点。
数据结构课程设计
JOSEPH环1、课程设计目的(1)较熟练地掌握C语言的基本内容及程序设计的基本方法与编程技巧。
(2)较熟练地掌握在系统上编辑、编译、连接和运行C程序的方法。
(3)通过设计一个完整程序,掌握数据结构的算法编写、类C语言算法转换成C程序并上机调试的基本方法。
2、课程设计方案论证2.1 问题描述编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正数)。
一开始任选一个整数作为报数上限值,从第一个人开始顺时针自1开始顺序报数,报到m的人出列,践踏的密码之作为新的m值,从它在顺时针方向上的下一个人开始重新从1开始报数,如此下去,直到所有人全部都出列为止。
试设计一个程序,求出出列顺序。
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=则正确的输出是什么?输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列。
2.2 数据结构设计此joseph环运用单向的数据结构循环链表存储结构模拟此过程。
数据的逻辑结构为线性结构;数据的物理结构分为链式结构,顺序存储的结构特点是逻辑顺序与物理顺序一致,可以随机存储,但有缺点就是插入和删除元素要伴随着大量元素的移动,并且存储空间是预先分配的,不灵活,存在空间浪费,表的存储空间难扩充,存储密度等于1。
通过对约瑟夫问题的分析,我认为单循环链表能较好的解决问题。
在建立循环链表时,输入决定约瑟夫环的大小。
与匹配的结点数也会变化,因此要进行动态内存分配。
而链式存储结构的特点是存储空间不一定连续,逻辑关系是由指针来实现的,逻辑上相邻,但物理上不一定相邻,非随即存取即访问任何一个元素的时间不同,存储空是动态分配的,并且存储密度小于1。
编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
《数据结构课程设计》指导书
《数据结构》课程设计指导书沈阳理工大学.信息学院2013.11.1一.目的与意义软件设计能力对计算机专业的学生是很重要。
通过数据结构的学习,使学生对软件编程能力有一定的提高。
数据结构课程设计是锻炼学生在进一步掌握模块化、结构化程序设计的方法的同时,培养学生运用已学知识分析问题、解决问题及编写实用程序的能力,通过对线性化、层次化、网络化数据结构的了解进一步掌握自然数据的结构方式及组织方式,让学生深入体会存储在计算机中的数据及程序中如何运用数据实现编程。
主要目的如下:1.通过本课程设计使学生对面向对象的设计过程有初的认识,并对面向对象的高能语言的学习打下基础,2.通过不同类型的程序设计使学生进一步掌握数据的几种不同的组织和存储方式,为高级编程做准备,3.为专业课的深入学习和毕业设计打基础二.任务和要求分析每一组题目,按要求完成相应的题目:1.题目参照附录中《数据结构课程设计》题目选题。
2. 要求:1)对相应的题目进行算法设计2)编写源代码3)上机调试4)显示调试结果5)写出实验总结3.课程设计说明书设计完成后,将自己选定的题目按上述要求完成课程设计说明书。
课程设计说明书内容包含:题目、要求、初步设计(可以是流程图、功能模块图)、详细设计、程序代码、测试数据、运行结果、遇到的问题及总结几部分。
三.进度安排设计总学时为2周第一周:查阅资料、小组讨论、进行模块划分写出分析报告,画N-S结构化框图,编写程序清单,上机调试.第二周周四、五:验收(计算机机房),并将课程设计报告交上来.四.考核标准与成绩评定方式成绩评定有如下几项参考:1.初步设计内容的考核:是否有查阅资料能力?是否有设计思想?2.程序编码能力调试能力的考核:程序是否清晰、易读?在技算计上是否可独立完成程序的调试,是否熟练?3.说明书质量的考核:设计结构是否合理?叙述是否正确?方案是否可行?4.答辩:设计结果的调试能力,对自己设计是否熟练?5.出勤率极平时表现的考核:出勤超过2次不到者成绩为不及格。
数据结构课程设计
《数据结构》课程设计实践指导书一、实践的目的和任务《数据结构》课程设计是计算机科学技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
开设本课程设计实践的主要目的就是要达到理论与实际应用相结合,提高学生的动手能力,完成计算机应用能力的培养;主要任务是通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及其它所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。
二、实践的内容和要求(一)实践内容实践内容为数据结构课程完成后,运用《数据结构》、程序设计以及其它所学课程中的知识和技术来解决实际的问题。
在解决实际应用性问题时,按照计算机解决问题的步骤进行以下几个方面的工作:采用简明、严格的问题描述,建立模型,设计求解方法,用计算机实现求解方法,最后进行测试和文档制作。
1、建立模型许多问题的最初描述既不精确又不简练,还有一些问题不可能简单而精确地用计算机可求解的形式来描述,即使有些可用计算机求解的问题,也需要在很大范围内确定问题的参数,而那些合理的参数值只有通过实验才能确定。
因此,要用计算机解决问题,必须首先要以简明、严格的方式将问题描述清楚。
数学或其它科学中的几乎所有分支都可作为某一类具体问题的抽象模型。
例如,在涉及到若干对象及其相互间关系的问题时所用的数学模型为图论;数值计算问题中常用的数学模型为线性方程组(用于求解电路的电流强度或结构中的应力)或微分方程(用于预报人口增长情况或化学反应速度等);在符号与文本处理问题时常用字符串及形式语法作为模型(如编译系统)。
《数据结构》课程中所介绍的各种结构均可作为一种模型。
2、构造算法对问题建立了适当的数学模型后,就可以依据这一模型求解。
最初的目标是给出一个算法形式的解法,这是设计的核心部分。
《数据结构》课程设计指导书1
《数据结构》课程设计指导书(共13题)一、课程设计的目的课程设计的目的是培养学生综合程序设计的能力,训练学生灵活应用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。
巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的学习作风。
为今后学习其他计算机课程打下基础。
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将书本上的理论知识和工作、生产实际有机地结合起来,从而锻炼学生分析问题、解决实际问题的能力,提高学生的编程序能力和创新意识。
二、课程设计的要求在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过算法的设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的课程设计与程序分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
三、课程设计的学生分组情况每组三至五人,共同研究、共同讨论,可以共同编写算法,但必须各自独立完成各自的程序。
四、课程设计的时间安排课程设计前两周:将各项任务及问题进行讲解、分析。
课程设计一周:星期一:学生对任务进行讨论、研究与分析,初步设计出算法。
星期二到星期四:设计出详细算法,并上机调试程序。
星期五到星期六:写出课程设计报告并考核。
五、课程设计的主要内容【课程设计题目一】一元稀疏多项式加法、乘法器【问题描述】设计一个一元稀疏多项式加法、乘法器用于计算两个多项式的加法和乘法。
例如(x2+4x5+2x9)+(x+3x4)或(7x4+4x6+2x9)*(x4+3x9)【基本要求】(1)输入并建立两个多项式f(x)和g(x);(2)输出每个多项式,要求输出时按指数从小到大输出。
(3)两个多项式完成加法、乘法运算。
(4)输出两个多项式的加法之和及乘积的结果。
(5)写出课程设计报告【实现提示】用带表头结点的单链表存储多项式。
【测试数据】分别选定三组测试数据进行测试,验证程序的正确性。
数据结构实验题目
实验题目一一、单链表基本运算【问题描述】设计并实现线性表的单链表存储和运算。
【基本要求】实现单链表的插入、删除和遍历运算,每种操作用一个函数实现。
插入操作:将一个新元素插入表中指定序号的位置。
删除操作:将指定序号的元素从表中删除。
遍历操作:从表头按次序输入所有元素的值,若是空表,则输出信息“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. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。
3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。
本课程针对高年级学生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。
在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。
通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。
2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。
3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。
4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。
教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。
数据结构与算法课程设计计划书-2011-2012-2(10级).
计算机科学与工程学院集中性实践教学计划书( 2011-2012 学年第二学期课程名称:数据结构与算法课程设计专业:计算机科学与技术软件工程、网络工程班级:计算机科学与技术101-6软件工程101-4网络工程101-4课程负责人:李锡祚、王玲芬、李威指导教师分配情况:专业指导教师计算机科学与技术李威、李笑牛、张恒博、云健、刘爽、包书哲软件工程王玲芬、王鹏杰、王存睿、孙世昶、网络工程李锡祚、姜楠、王晓强、王波教学起止周:第1 至3 教学周一、教学目的与要求:数据结构与算法课程设计的目的是使同学们能够根据数据对象的特性,合理的组织数据并能综合运用数据结构与算法基本知识和程序设计基本知识解决实际问题,培养基本的、良好的程序设计技能。
二、主要阶段、内容、时间及地点安排(以天为单位计:阶段与内容第1阶段:指导教师布置设计任务并解析有关题目的设计指标和任务的具体内容,学生选择题目,明确问题描述和要求,查阅资料。
(1天;各班长或学习委员将本班的选题表交给辅导教师,一人一题,每道题的选择人数原则上不能超过3人,第一天课程设计结束后,每名学生都要确定题目。
第2阶段:明确题目要求、确定数据结构、设计算法,编写程序、调试程序、测试程序(11天;第一周,学生应明确题目要求、确定数据的逻辑结构和存储结构、实现基本操作的编码与调试、实现主菜单。
第二周,完成核心算法的设计、编码与调试。
第三周,完成剩余任务的编码与调试,准备足够的测试数据,对软件进行测试与调试。
第3阶段:完成设计任务,准备验收、答辩(1天;第4阶段:答辩(上机演示,回答教师提问(1天;第5阶段:撰写课程设计报告(2天。
地点与时间地点:金石滩校区图书馆时间:计算机科学与技术:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午第2大节、下午第二周上午、下午上午第2大节、下午第三周上午、下午上午第2大节、下午(验收软件工程:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午、下午下午第二周上午、下午上午、下午下午第三周上午、下午上午、下午下午(验收网络工程:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午下午上午第二周上午、下午上午下午上午第三周上午、下午上午下午上午(验收注:上午8:30~11:10下午1:40~4:20三、课程设计题目及具体要求:1.成绩管理问题描述:给出n个学生的考试成绩表,成绩表包括学生的学号、姓名、考试成绩(高等数学、英语、物理,设计一个简单的成绩管理程序。
数据结构课程设计
实现二叉树的创建
功能:
D
C
B
A
E
二叉树
方法:
创建二叉树的方法:createTree()
层次遍历的方法:leavelOrder()
计算叶子节点的方法:countLeafNode()
创建哈夫曼树的方法:compareNum()
计算码长的方法:print()
二叉树
思路:
通过从键盘上读取利用先序遍历结果创建一颗二叉树
思路:
01
从键盘上直接输入节点数和节点值添加到链表
03
通过删除方法删除某个位置上的节点
05
建立头节点headNode和尾节点endNode的双向循环链表
02
执行插入方法可以实现某个位上的插入
04
就地逆置通过改变指针指向逆向输出
06
双向循环链表
通过建立一个哈夫曼树,实现哈夫曼算法
计算出二叉树的叶子节点数
通过深度优先遍历来进行图的连通性的判断如果该图是联通的连通分量为其本身,否则输出该图不是连通的并计算出连通分量
有向图
致谢!
层次遍历:通过利用队列思想看访问的节点不是空时进队列,然后访问下一个节点,头一个节点出队列。
通过判断访问节点左右孩子为空来计算叶子节点
通过输入一数组找出该数组中最小的两个,然后相加得到的数为这两个最小数的根节点依次类推,哈弗曼编码是向右拐加1向左拐加0
二叉树
功能:
01
创建一个有向图
02
实现有向图的深度优先遍历
03
实现有向图的广度优先遍历
04
实现实现有向图的增加边的功能
05
实现有向图的删除边的功能
数据结构课程设计选题
数据结构课程设计选题题目选题一:迷宫与栈问题【问题描述】以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
2)编写递归形式的算法,求得迷宫中所有可能的通路。
3)以方阵形式输出迷宫及其通路。
【测试数据】迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
出口出口选题二:算术表达式与二叉树【问题描述】一个表达式和一棵二叉树之间,存在着自然的对应关系。
写一个程序,实现基于二叉树表示的算术表达式的操作。
【任务要求】假设算术表达式Expression内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:1)ReadExpre(E)—以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
2)WriteExpre(E)—用带括弧的中缀表达式输出表达式E。
3)Assign(V,c)—实现对变量V的赋值(V=c),变量的初值为0。
4)Value(E)—对算术表达式E求值。
5)CompoundExpr(P,E1,E2)--构造一个新的复合表达式(E1)P(E2)【测试数据】1)分别输入0;a;-91;+a*bc;+*5^x2*8x;+++*3^x3*2^x2x6并输出。
2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
选题三:银行业务模拟与离散事件模拟【问题描述】假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。
数据结构课程设计
数据结构课程设计一、课程设计目的:通过本次数据结构课程设计,让学生在学习数据结构的基础上,能够设计并实现一个较为完整的实际项目,提高学生的计算机编程与软件设计能力。
二、课程设计要求:1. 课程设计类别:选定的数据结构要求为图形数据结构。
2. 课程设计内容:在实际项目中,选取一种图形数据结构,设计并构建一个相应的系统。
3. 课程设计的具体要求:(1)需求分析:具体描述系统实现的需求、目的,提出解决方案。
包括系统的输入、输出及功能描述,功能流程图等。
(2)设计方案:选择适当的数据结构进行系统设计,建立好数据模型。
结合实际情况,合理地选择相关算法,确保程序的合理性和有效性。
同时,充分考虑代码的可读性、可扩展性和可维护性。
(3)程序实现:按照设计方案,编写程序,完成系统的核心代码。
在进行编码时,要注意代码的规范性,结构清晰,注释完整。
(4)系统测试:对实现的程序进行测试,包括单元测试、模块测试和整体测试,并记录测试结果和测试用例。
根据测试结果进行反复修改和优化,确保系统能够在各种情况下运行良好。
(5)成果展示:制作系统使用说明书,对完成的系统进行展示和演示,要求能够清晰地展示系统的界面和各种功能的实现过程。
三、课程设计任务:1. 选定数据结构并进行需求分析。
2.根据需求分析结果,设计出该系统的初始版本,提供该系统的整体框架及流程图。
3.建立数据结构,编写代码实现该系统。
4.对实现的系统进行单元测试、模块测试和整体测试。
5.根据测试结果进行调整,优化系统的功能,并完善设计方案和代码实现。
6.制作系统使用说明书,进行成果展示。
四、课程设计的评分标准:1. 选定数据结构并进行需求分析(10分)。
2.设计方案,提供该系统的整体框架及流程图(15分)。
3.建立数据结构,编写代码实现该系统(30分)。
4.对实现的系统进行单元测试、模块测试和整体测试,并记录测试结果和测试用例(15分)。
5.根据测试结果进行调整,优化系统的功能,并完善设计方案和代码实现(20分)。
数据结构课程设计参考题目(一)
数据结构课程设计参考题目(一)数据结构是计算机科学中的一门基础课程,它主要研究数据的组织、存储、管理和操作等方面的问题。
随着计算机技术的发展,数据结构逐渐成为各个领域必不可少的一门课程。
而数据结构课程设计参考题目是该课程的一项重要内容,它能够帮助学生更好地掌握课程知识,提高对数据结构的理解和应用能力。
以下是几个数据结构课程设计参考题目。
1.链表操作设计一个链表类,使得它能够实现插入、删除、查找和遍历链表的操作。
要求采用单向链表或双向链表实现,并考虑链表的循环操作。
同时,要求能够对链表进行排序操作。
2.栈与队列操作设计一个栈和队列类,使得它们能够实现入栈、出栈、入队和出队的操作。
要求采用数组或链表实现,并可用于表达式转换和括号匹配等相关问题。
3.堆排序算法实现堆排序算法,要求能够对整型数列进行排序,并输出其排序后的结果。
要求堆的构建、删除和调整操作均可用最大堆或最小堆实现。
同时,要求能够对算法的时间复杂度进行分析,并与快速排序等算法进行比较。
4.哈希表实现设计一个哈希表类,使其能够实现插入、删除和查找等操作。
要求采用链地址法或开放地址法实现,同时需要考虑哈希函数和扩容等问题。
要求能够对哈希冲突的解决方法进行比较和分析。
5.树与图的遍历实现二叉树、B树或B+树的遍历操作,要求能够实现先序、中序和后序遍历,并能够循环遍历或递归遍历。
同时,要求能够对树的平衡性进行探究和讨论。
另外,树的遍历也是图的遍历的基础,可以通过深度优先搜索或广度优先搜索实现图的遍历。
以上是一些常见的数据结构课程设计参考题目,它们可以锻炼学生的编程能力、算法分析能力和数据处理能力,同时也可以增强学生对数据结构知识的理解和掌握。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文学研究助手一、问题描述:文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
二、需求分析:1、文本串非空且以文件形式存放,统计匹配的词集非空。
文件名和词集均由用户从键盘输入;2、“单词”定义:由字母构成的字符序列,中间不含空格字符且区分大小写;3、待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;4、在计算机终端输出的结果是:单词,出现的次数,出现的位置所在行的行号,同一行出现两次的只输出一个行号;5、测试数据:文本文件为本次实习中的word.txt:待统计的词集:he she it has to here can not is was三、概要设计:拟采用对两个有序表进行相互比较的策略进行“单词匹配”。
程序中将涉及下列三个抽象数据类型: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;ListCompare(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)单词文本串文件单元模块------实现文本串文件类型;四、详细设计1、主程序中的宏定义:#define MAXSIZE 1000 //字符空间的最大容量#define MAXLEN 20 //单词的最大长度#define MAXNUM 16 //一行中单词最多个数#define FALSE 0#define TRUE 12、存储结构/*** 堆结构的定义*/typedef struct{char stores[MAXSIZE];int freep; /*当前可用空间开始位置*/}HeapSpace;HeapSpace sp;/*** 单词数据类型定义*/typedef struct{ //单词在堆中的位置描述int stadr; /*单词在对空间中的开始位置*/int len; /*单词长度*/}WordType;typedef struct{ //单词描述char ch[MAXLEN]; /*单词字符串*/int size; /*单词长度*/}Sequence;/*** 有序表类型定义*/typedef WordType ElemType;typedef struct NodeType{ //单词有序表结点定义ElemType data;struct NodeType *next;}NodeType,*LinkType;typedef struct{ //单词有序表定义LinkType head; /*有序表头指针*/LinkType tail; /*有序表尾指针*/int size; /*有序表结点个数*/}OrderList;* 记录一行中匹配成功单词在目标词汇表中的位置*/typedef struct{int eqelem[MAXNUM]; /*单词在目标词汇表中的位置*/int last; /*匹配成功单词的个数*/}EqelemList;/*** 文件测试相关的数据类型定义*/typedef struct Node{ //单词在文件中的位置int elem; /*被测单词在文件中的行号*/struct Node *next;/*指向下一个行号结点的指针*/}Node,*Link;typedef struct{ //单词统计分析记录结构定义WordType data; /*被测试的单词*/int count; /*在文件中出现的次数*/Link Next; /*记录出现的所有行号的脸表头指针*/}HeadNode;/*** 文本文件测试结果记录定义*/typedef HeadNode ResultType[MAXNUM];typedef int status;3、主要算法设计:/*---------------------与单词相关的函数---------------------*//*------------------------------------------------------------------*//* 定义新单词函数*//* 功能:把新单词放入堆中*//* 参数:WordType *nw--单词描述信息指针*//* Sequence cha--单词信息*//* 返回值:操作成功与否的状态信息*//* 0--操作失败,空间不足;1--操作成功*//*--------------------------------------------------------------*/status NewWord(WordType *nw,Sequence cha){int i,k;if(sp.freep+cha.size>=MAXSIZE){printf("Heap Full!\n");getchar();return 0;else{i=sp.freep;sp.freep=sp.freep+cha.size;for(k=0;k<cha.size;k++) sp.stores[i+k]=cha.ch[k];nw->stadr=i;nw->len=cha.size;return 1;}}/*------------------------------回到最初空间-------------------*/ void NewLength(OrderList rs){int m=0;LinkType p,q;p=rs.head->next;while(p){if(m<=p->data.stadr){m=p->data.stadr;q=p;}p=p->next;}sp.freep=m+q->data.len;}/*------------------------------------------------------------------*//* 复制单词信息函数*//* 功能:把一个单词信息复制到另一个变量中*//* 参数:WordType *nw--新单词描述信息指针*//* WordType *oldw--旧单词描述信息指针*//* 返回值:无*//*----------------------------------------------------------------*/ void CopyWord(WordType *nw,WordType oldw){nw->stadr=oldw.stadr;nw->len=oldw.len;}/*------------------------------------------------------------------*//* 单词比较函数*//* 功能:比较堆中两单词的大小*//* 参数:WordType wd1--第一个单词描述信息*//* WordType wd2--第二个单词描述信息*//* 返回值:-1--小于;0--等于;1--大于*//*--------------------------------------------------------------*/int WordCmp(WordType wd1,WordType wd2){int k,si,sj,m;si=wd1.stadr;sj=wd2.stadr;for(k=0;k<=wd1.len&&k<=wd2.len;k++){m=fabs((float)(sp.stores[si+k]-sp.stores[sj+k]));if(m!=0&&m!=32)break;if(k==wd1.len||k==wd2.len)break;}if(wd1.len==wd2.len){if(k==wd1.len)return 0;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}else if(wd1.len<wd2.len){if(k==wd1.len)return -1;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}else{if(k==wd2.len)return 1;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}}/*------------------------------------------------------------------*/ /* 打印单词函数*/ /* 功能:打印堆中一个单词*/ /* 参数:WordType wd--单词描述信息*/ /* 返回值:无*/ /*------------------------------------------------------------------*/ void PrintWord(WordType wd){int i;for(i=0;i<wd.len;i++) putchar(sp.stores[wd.stadr+i]);}/*-------------------与有序表相关的函数----------------------*//*-------------------------------------------------------------------*//* 结点生成函数*//* 功能:生成一个单词在堆中存储信息的结点*//* 参数:LinkType *p--生成的新结点指针*//* ElemType e--单词存储信息*//* 返回值:TRUE--成功;FALSE--失败*//*-----------------------------------------------------------------*/ status MakeNode(LinkType *p,ElemType e){*p=(LinkType)malloc(sizeof(NodeType));if(!(*p)) return FALSE;(*p)->data.stadr=e.stadr;(*p)->data.len=e.len;(*p)->next=NULL;return TRUE;}/*------------------------------------------------------------------------*/ /* 有序表初始化函数*/ /* 功能:申请头结点,初始化有序表*/ /* 参数:OrderList *L--有序表指针*/ /* 返回值:TRUE--初始化成功;FALSE--初始化失败*/ /*------------------------------------------------------------------------*/ status InitList(OrderList *L){ElemType wd;wd.len=0;if(MakeNode(&(L->head),wd)){L->tail=L->head;L->head->next=NULL;L->size=0;return TRUE;}else{L->head=NULL;return FALSE;}}/*------------------------------------------------------------------*//* 撤销有序表函数*//* 功能:释放有序表所有结点,撤销有序表*//* 参数:OrderList *L--有序表指针*//* 返回值:无*//*------------------------------------------------------------------*/ void DestroyList(OrderList *L){LinkType p,q;p=L->head;while(p){q=p;p=p->next;free(q);}L->head=L->tail=NULL;}/*-------------------------------------------------------------------*/ /* 有序表查找函数*//* 功能:确定给定单词e在有序表中的位置*//* 参数:OrderList L--有序表*//* ElemType e--给定要查找的数据e *//* LinkType *q--有序表结点指针*//* 查找成功,q指向具有e值的结点*//* 查找失败,q指向小于e的结点*//* 返回值:int型,1--查找成功;0--查找失败*//*-----------------------------------------------------------------*/ status LocateElem(OrderList L,ElemType e,LinkType *q) {LinkType pre,p;p=L.head->next;while(p){if(WordCmp(p->data,e)==0){*q=p;return TRUE;}if(WordCmp(p->data,e)==-1)*q=p;p=p->next;}return FALSE;}/*------------------------------------------------------------------*//* 有序表插入函数*//* 功能:在制定结点q后插入一个结点s *//* 参数:OrderList *L--有序表指针*//* LinkType q--指定结点指针*//* LinkType s--待查入结点指针*//* 返回值:无*//*---------------------------------------------------------------*/void InsertAfter(OrderList *L,LinkType q,LinkType s){if(L->head&&q&&s){s->next=q->next;q->next=s;if(L->tail==q) L->tail=s;L->size++;}}/*------------------------------------------------------------------------*/ /* 表匹配函数*/ /* 功能:把Lb表中匹配La表成功的元素放入s表*/ /* 参数:OrderList La--存放统计单词的有序表*/ /* OrderList Lb--存放待匹配单词的有序表*/ /* EqelemList *s--存放匹配成功单词信息表指针*/ /* 返回值:无*/ /*-------------------------------------------------------------------------*/ void ListCompare(OrderList La,OrderList Lb,EqelemList *s) {int pos,n;LinkType pa,pb;if(La.head&&Lb.head){pa=La.head->next;pb=Lb.head->next;s->last=pos=0;while(pa&&pb){n=WordCmp(pa->data,pb->data);if(n==0){s->eqelem[s->last++]=pos++;pa=pa->next;pb=pb->next;}else if(n==-1){pa=pa->next;pos++;}else pb=pb->next;}}}/*--------------------------------------------------------*//* 判表空函数*//* 功能:判断表L是否是空表*//* 参数:OrderList L--有序表*//* 返回值:0--非空表;1--空表*//*--------------------------------------------------------*/ status ListEmpty(OrderList * L){if(L->size==0) return TRUE;return FALSE;}int ListLength(OrderList* L){ /*返回判表长度*/ if(L->head ==L->tail) return 0;else return L->size ;}/*-----------与文本文件有关的函数-----------------------*/ /*---------------------------------------------------------------*/ /* 字符判断函数*/ /* 功能:判断文件中下一个字符是否为回车符*/ /* 参数:FILE *f--文件指针*/ /* 返回值:0--不是回车符;1--是回车符*/ /*---------------------------------------------------------------*/ int feoln(FILE *f){char cha;cha=fgetc(f);if(cha=='\n') return(TRUE);ungetc(cha,f);return FALSE;}/*---------------------------------------------------------------*/ /* 读取单词函数*/ /* 功能:从文件中读取一个单词*/ /* 参数:FILE *f--文件指针*/ /* Sequence *st--指向单词的指针*/ /* 返回值:无*/ /*----------------------------------------------------------------*/ void GetAWord(FILE *f,Sequence *st)char ch;int k=0;ch=fgetc(f);while(ch==' '){ch=fgetc(f);if(ch=='\n')break;}/*去掉空格和回车*/if(ch=='\n'){ungetc(ch,f);ch=' ';}/*最后一个为回车键,文件指针回指*/while(((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))&&!feof(f)) {st->ch[k]=ch;ch=fgetc(f);k++;}if(ch=='\n')ungetc(ch,f);st->size=k;}/*----------------------------------------------------------------*//* 读取文件当前行单词函数*//* 功能:提取文件指针所指行所有单词*//* 参数:FILE *f--文件指针*//* OrderList *ta--存放单词有序表的指针*//* 返回值:0--操作失败;1--操作成功*//*----------------------------------------------------------------*/status ExtractWord(FILE *f,OrderList *ta){int i;char lendc;Sequence str;WordType nwd;LinkType p,q;LinkType s;InitList(ta);p=ta->head;q=ta->head;for(i=0;!feof(f);i++){if(feoln(f))return(TRUE);GetAWord(f,&str);/*从文件中读出一个单词*/NewWord(&nwd,str);/*将单词放入堆存储空间*/MakeNode(&s,nwd);/*生成一个单词节点*/if(ta->head->next){while(p!=NULL&&WordCmp(p->data,s->data)==-1){q=p;p=p->next;}p=q;}InsertAfter(ta,p,s);p=ta->head->next;q=ta->head;}/*------------------------------------------------------------------*//* 文件单词匹配函数*//* 功能:统计指定单词在文件中出现的次数和位置*//* 参数:FILE *f--文件指针*//* OrderList pat--指定统计的单词有序表*//* ResultType rs--统计结果列表*//* 返回值:0--统计失败;1--统计成功*//*------------------------------------------------------------------*/status match(FILE *f,OrderList pat,ResultType rs){int i,k,linenum,failed,fsp;OrderList sa;EqelemList eqlist;Link p,q;if(!pat.head)return FALSE;linenum=1;while(!feof(f)){ExtractWord(f,&sa);ListCompare(pat,sa,&eqlist);i=0;if(st)while(i<st)/*计算出单词出现行号以及一行出现次数*/{p=(Link)malloc(sizeof(Node));p->next=rs[eqlist.eqelem[i]].Next;rs[eqlist.eqelem[i]].Next=p;p->elem=linenum;rs[eqlist.eqelem[i]].count++;i++;}/*内层while*/linenum++;/*行数加1*/DestroyList(&sa);NewLength(pat);}/*外层while*/fclose(f);return TRUE;}/*-------------------------------------------------------------------*//* 初始化文件函数*//* 功能:输入指定的文件名并打开文件*//* 参数:FILE **f--返回的文件指针*//* 返回值:0--初始化失败;1--初始化成功*/ /*---------------------------------------------------------------*/ status Initialization(FILE **fr){char FileName[30];printf("Input file name:");do{scanf("%s",FileName);}while(strlen(FileName)==0);*fr=fopen(FileName,"r");if(*fr){printf("file open!\n");return TRUE;}else{printf("file not open!\n");return FALSE;}}/*------------------------------------------------------------------*/ /* 输入统计的词集函数*/ /* 功能:输入待统计的词集并建立起数据结构*/ /* 参数:OrderList *pt--返回的词集有序表指针*/ /* 返回值:无*/ /*------------------------------------------------------------------*/ void InputWord(OrderList *pt){char cc;int i=0;Sequence ws;LinkType p,q,s;WordType nwd;InitList(pt);p=pt->head;q=pt->head;while((cc=getchar())){if(cc!=' '&&cc!='\n'){ws.ch[i]=cc;i++;}else{ws.size=i;NewWord(&nwd,ws);MakeNode(&s,nwd);if(pt->head->next){while(p!=NULL&&WordCmp(p->data,s->data)==-1){q=p;p=p->next;}p=q;}InsertAfter(pt,p,s);p=pt->head->next;q=pt->head;i=0;}if(cc=='\n')return;}}/*------------------------------------------------------------------*//* 初始化统计结果表函数*//* 功能:用待统计词集初始化统计结果表*//* 参数:ResultType rs--统计结果数组*//* OrderList pt--待统计的词集表*//* 返回值:无*//*-----------------------------------------------------------------*/void InitRList(ResultType rs,OrderList pat){int k;LinkType p;p=pat.head->next;for(k=0;k<pat.size;k++){CopyWord(&rs[k].data,p->data);rs[k].Next=NULL;rs[k].count=0;p=p->next;}}/*------------------------------------------------------------------*//* 输出统计结果函数*//* 功能:输出统计的结果*//* 参数:ResultType rs--统计结果数组*//* int n--待统计的词集个数*//* 返回值:无*//*-------------------------------------------------------------------*/void OutResult(ResultType rslist,int n){int i,j;Link p;for(i=0;i<n;i++){printf("The word ");PrintWord(rslist[i].data);printf(" appeared in the file %d times",rslist[i].count);if(rslist[i].count!=0){printf(" and on ");p=rslist[i].Next;for(j=0;j<rslist[i].count;j++)if(j<rslist[i].count-1){printf("%d,",p->elem);p=p->next;}else printf("%d\n",p->elem);}else printf("\n");}}/*------------------------------------------------------------------*//* 撤销统计结果数据空间函数*//* 功能:释放存放统计结果数据的动态存储空间*//* 参数:ResultType rs--统计结果数组*//* 返回值:无*//*------------------------------------------------------------------*/ void FreeResult(ResultType rs,int n){int i;Link p,q;for(i=0;i<n;i++)if(rs[i].Next!=NULL)break;if(rs[i].Next!=NULL)for(i=0;i<n;i++){p=rs[i].Next;while(p){q=p;p=p->next;free(q);}rs[i].Next=NULL;rs[i].count=0;}else return;}int main(){int flag=0;sp.freep=0; /*sp为全局变量*/FILE *fp=NULL;OrderList *pt;pt=(OrderList *)malloc(sizeof(OrderList));pt->head=NULL;ResultType rs;do{Initialization(&fp); /*输入文件名并打开文件*/printf("input search words\n");getchar();InputWord(pt); /*输入查询的单词*/if(fp&&!ListEmpty(pt)){InitRList(rs,*pt);if(match(fp,*pt,rs))OutResult(rs,ListLength(pt));elseDestroyList(pt);}printf("Do you want to have a seach again?(YES--1/NO--0)\n");scanf("%d",&flag);fflush(stdin);}while(flag);system("pause");return 0;}五、调试分析:1、在编程的过程中,对设计做了如下修改:1)考虑到堆空间可能设置不够大,以至可能引起数组出界的错误,因此将NewWord 改为status类型函数,返回堆空间分配成功与否的信息。