数据结构课程设计报告(完结)
数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。
二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。
在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。
三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。
2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。
3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。
4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。
5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。
四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。
2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。
通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。
3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。
链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。
在实现链表时,我们定义了一个节点结构,包含数据域和指针域。
通过指针的方式将节点连接起来,形成一个链式结构。
同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。
4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。
数据结构课程设计报告

目录第一章课程设计的目的和意义 (1)第二章需求分析 ...................................................................... 错误!未定义书签。
第三章系统设计 (3)3.1 概要设计 (3)3.2详细设计 (5)第四章系统测试 (5)4.1系统运行初始界面 (6)4.2录入航班、客户信息界面 (6)4.3 查看所有航班信息界面 (6)4.4 买票、退票界面 (7)第五章心得体会 (7)第六章参考文献 (8)致谢 (8)附录 (9)源程序: (9)第一章课程设计的目的和意义《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:一:了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;二:初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;三:提高综合运用所学的理论知识和方法独立分析和解决问题的能力;四:训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
五:锻炼动手操作能力,培养我们的创新思维能力。
从编写代码,到调试程序,再到运行程序,这是设计的最重要环节,它需要我们用逻辑思维将我们所学知识和实际相结合,并在对方案的分析过程中能够有所创新,从而使运行方案更严谨更简洁。
培养好良好的思维,便要将这种思维赋予实践,即动手操作能力。
数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构课程设计报告

《数据结构》课程设计报告姓名:潘庆专业:计算机科学与技术班级: J1401学号: 4141110020指导老师:王新宇2016年1月15日目录一、需求分析 (2)二、设计说明 (3)1. 算法设计的思想 (3)2. 主要的数据结构设计说明 (4)3. 程序的主要流程图 (5)4. 程序的主要模块 (6)5. 程序的主要函数及其伪代码说明 (6)三、上机结果及体会 (13)1.实际完成情况说明 (13)2.程序运行结果及图示 (13)3.问题及解决方案 (16)4.收获及体会 (16)附录(源程序) (17)一、需求分析1. 程序所实现的功能:七种排序算法的演示:(1)直接插入排序;(2)冒泡排序;(3)选择排序;(4)快速排序;(5)归并排序;(6)堆排序;(7)基数排序。
要求:(1)设计一个人机交互界面;(2)给出从初始开始时每一趟排序的结果。
2. 程序的输入:用户开始时自行输入排序个数和具体数字(须为整数)void input_int(SqList &L){int i;printf("请输入排序个数:");scanf("%d",&L.length);printf("请输入%d个整数:",L.length);for(i=1;i<=L.length;i++)scanf("%d",&L.r[i].key);}3. 程序的输出:用户选择具体排序方法后,程序将每一趟排序的输出结果一次性输出,最后一趟即为最终排序结果void output_int(SqList L){int i;for(i=1;i<=L.length;i++)printf("%d ",L.r[i].key);}4. 测试数据:12 2 16 30 8 28 4 10 20 6 18二、设计说明1. 算法设计的思想(1). 插入排序基本思路:向有序表中插入新的元素(或记录),使之仍有序,此时表的长度也相应地发生变化。
数据结构课程设计报告

heapadjust(l,1,i-1);
}}
基本思想:
堆排序利用了大根堆堆顶记录的关键字最大这一特征,使得在当前无序区中选取最大关键字的记录变得简单。先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区。再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录r[n]交换,由此得到新的无序区r[1..n-1]和有序区r[n],且满足r[1..n-1].keys≤r[n].key。由于交换后新的根R[1]可能违反堆性质,故应将当前无序区r[1..n-1]调整为堆。然后再次将r[1..n-1]中关键字最大的记录r[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区r[1..n-2]和有序区r[n-1..n],且仍满足关系r[1..n-2].keys≤r[n-1..n].keys,同样要将r[1..n-2]调整为堆。
quicksort(l,i+1,high); 对r[I+1.high]进行快速排序
}}
基本思想
设当前待排序的无序区为r[low..high],利用分治法可将快速排序的基本思想描述为:①分解:在r[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间r[low..pivotpos-1]和r[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。 注意:划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注pivot=r[pivotpos])r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys 其中low≤pivotpos≤high。②求解:通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和r[pivotpos+1..high]快速排序。③组合:因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
《数据结构》课程设计报告

《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。
本课程目标如下: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课时,学习排序和查找算法,掌握各类算法的实现和应用。
数据结构课程设计报告(最终版)

数据结构课程设计报告
题目:
组长:
成员:
成员:
成员:
成员:
成员:
指导教师:
年月日
一、课程设计题目:
二、问题定义:(由教师指定)
三、需求分析
以明确的无歧义的陈述说明课程设计的任务,强调的是程序要做什么?并明确规定:
1、输入的形式和输入值的范围;
2、输出的形式;
3、程序所能达到的功能;
4、算法涉及的基本理论分析:比如对文件压缩,算法用到了
Huffman树,就要从理论上对文件压缩的几种方式、Huffman树的定义、Huffman编码的原理、解码的过程等进行分析。
5、题目研究和实现的价值。
四、算法设计
1、概要设计
阐述说明本算法中用到的所有数据结构的定义及其含义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计
(1)实现概要设计中定义的所有数据类型;
(2)所有函数的接口描述;
(3)所有函数的算法描述(只需要写出伪码算法);
(3)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序),可采用流程图、N – S 图或PAD图进行描述
(4)画出函数的调用关系图。
五、算法实现
以附件形式
六、软件测试
这里的测试主要是基于功能的黑盒测试,所以首先提出测试的功能点,然后给出测试数据(包括正确的输入及其输出结果和含有错误的输入及其输出结果。
)
要求在附件里给出软件的基本数据和测试数据。
七、技术讨论(可选)
八、收获与体会
九、软件运行的部分截图及说明。
数据结构课程设计报告(完整版)[1]
![数据结构课程设计报告(完整版)[1]](https://img.taocdn.com/s3/m/91bda92001f69e314232940e.png)
第二题:电梯模拟1、需求分析:模拟某校九层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。
而题目的最终要求输出时:按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。
2、设计2.1设计思想:(1)数据结构设计本题中的电梯的变化,是一个动态变化的过程,要在动态过程中实现正常跳转,首先要确定各种跳转的状态,因而这里我使用枚举类型来表示电梯的各种状态的:enum {up,down,stop,home}State(home);同时初始化最初状态为电梯在本垒层。
而在电梯的运行过程中对于乘客来说,显然有一个进入电梯与出电梯的队列,因而在这里我是用的链表来实现这个过程的,同时用结构体来保存该乘客的信息:typedef struct passage{int now;//乘客当前所在的位置int dis;//乘客的目地地int wait;//最长的等待的时间int waitnow;//已经等待的时间struct passage *next;}Passage;虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:typedef struct lift{int count_C;//计数电梯已到达的层数int count_A;//系统的总时间计数器记得必须初始化为0int flag_in[High];//九个楼层有无请求的标志哪个楼层如果有请求该标志置1int num;//等待队列中的人数记得要进行初始化为0int people;//电梯中人数int flag_out[High];}Lift;(2)算法设计顾名思义本程序在运行的过程中用到的算法便是—“电梯算法”,电梯算法借鉴了磁盘寻道C-LOOK算法,即电梯向一个方向运行,直到这个方向上没有服务为止。
数据结构课程设计报告

数据结构课程设计报告设计报告一、项目简介:本项目是一个基于C++语言的数据结构课程设计,旨在通过实践巩固学习的数据结构知识,并提高编程能力和问题解决能力。
二、项目背景:数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织、存储和操作方法。
通过学习数据结构可以更好地理解和分析各种算法,并能够设计和实现高效的程序。
三、项目目标:本项目的主要目标是设计和实现一些常见的数据结构,包括链表、栈、队列、二叉树、图等。
通过实现这些数据结构,可以进一步加深对其特性和功能的理解,并能够灵活地应用于实际问题的解决。
四、项目内容:本项目主要包括以下几个部分:1. 链表:实现单链表、双链表和循环链表,并实现相关的操作,如插入、删除、查找等。
2. 栈:实现顺序栈和链式栈,并实现相关的操作,如入栈、出栈、判空、判满等。
3. 队列:实现顺序队列和链式队列,并实现相关的操作,如入队、出队、判空、判满等。
4. 二叉树:实现二叉树的创建、遍历(前序、中序、后序)、搜索等操作,并实现相关的应用,如表达式树、堆等。
5. 图:实现邻接矩阵和邻接表两种表示方法,并实现图的创建、深度优先搜索、广度优先搜索等操作,并实现相关的应用,如最小生成树、最短路径等。
6. 其他数据结构:根据实际需要,可以设计和实现其他一些数据结构,如哈希表、二叉搜索树等。
五、项目实施计划:1. 学习和理解数据结构的基本概念和特性。
2. 分析和设计各个数据结构的实现方法和相关操作。
3. 使用C++语言实现各个数据结构,并编写相应的测试程序进行验证。
4. 进行性能测试和功能测试,并进行相关的优化和改进。
5. 编写项目文档,包括设计报告、使用说明等。
六、项目成果:1. 完成了各个数据结构的设计和实现。
2. 实现了相应的测试程序进行验证和功能测试。
3. 编写了项目文档,包括设计报告、使用说明等。
七、项目总结:通过这个数据结构课程设计项目,我深入学习了各种常用数据结构的实现和应用,提高了自己的编程能力和问题解决能力。
数据结构课设报告

《数据结构》课程设计报告一、设计目的《数据结构》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
二、设计要求1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。
3、本次课程设计按照教学要求需要在三周时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、编程语言任选。
一〉.基础类题目1.猴子选大王(*)任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:(注:分别顺序存储结构和链式存储实现)输入数据:输入m,n。
m,n 为整数,n<m输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能㈠、数据结构与核心算法的设计描述链式存储实现:#include<iostream.h>#include<malloc.h>#include<stdio.h>typedef struct LNode{int data;struct LNode *next;}LNode, *LinkList;void CreateList(LinkList &L,int m)//尾插法建立单向循环链表int ListDetele(LinkList &q,int n)//删除被点到的猴子㈡、程序调试及运行结果分析㈢、程序清单#include<iostream.h>#include<malloc.h>#include<stdio.h>typedef struct LNode{int data;struct LNode *next;}LNode, *LinkList;void CreateList(LinkList &L,int m){ //尾插法建立单向循环链表int i;L = (LinkList)malloc(sizeof(LNode));L->next = NULL;LNode *r;r = L;for(i=1;i<=m;i++){LNode *p;p = (LinkList)malloc(sizeof(LNode));p->data = i;r->next = p;r = p;}r->next=L->next;}int ListDetele(LinkList &q,int n) {LinkList s;int j=1;while(q->next!=q){ while(j<=n-1){q=q->next;j++;}s=q->next;q->next=s->next;free(s);j=1;}cout<<" 猴王: "<<q->data<<endl;return 1;}void main(){LinkList q;int n,m;cout<<"输入猴子个数m和n:";cin>>m>>n;CreateList(q,m);ListDetele(q,n);}顺序存储结构:㈠、数据结构与核心算法的设计描述#include<iostream.h>void main(){int n,m;cout<<"输入猴子数m和报数n:";cin>>m>>n;int *a=new int[m];int i,sum=0,count=m;//存剩余猴子数for(i=0;i<m;i++)a[i]=1;i=0;while(i<=m){if(i==m)i=0;//当i=n时,循环回去sum+=a[i];if(sum==n)//当报到n时{sum=a[i]=0; //淘汰倒霉猴子;即赋0count--;//剩余猴子数-1if(count==1)break;//剩1只时结束}i++;}for(i=0;i<m;i++)if(a[i]!=0)cout<<"猴王是"<<i+1<<endl;delete []a;}㈡、程序调试及运行结果分析2.线索二叉树(**)任务:1.建立中序线索二叉树,并且中序遍历;2. 求中序线索二叉树上已知结点中序的前驱和后继;㈠、数据结构与核心算法的设计描述#include<malloc.h>#include<stdlib.h>#include<iostream.h>#define MAX 100typedef enum PointerTag {Link,Thread}; //Link==0:指针,Thread==1:线索typedef struct BitNode{char data;struct BitNode *lchild,*rchild;//左右孩子的指针PointerTag LTag,RTag; //左右标志}BitNode, *Bitree;Bitree pre=NULL;Bitree point[MAX+1];int CreatBiTree(Bitree &T)//先序创建二叉树void InThreading(Bitree p)//中序遍历线索化二叉树int InOrderThreading(Bitree &Thrt,Bitree T)//中序遍历线索化二叉树T,并将其中序线索化,Thrt指向头节点Bitree InPre(Bitree p)//前驱Bitree InNext(Bitree p)//后继int Traverse_Thr(Bitree T)//各个节点的前驱和后继㈡、程序调试及运行结果分析㈢、程序清单#include<malloc.h>#include<stdlib.h>#include<iostream.h>#define MAX 100typedef enum PointerTag {Link,Thread}; //Link==0:指针,Thread==1:线索typedef struct BitNode{char data;struct BitNode *lchild,*rchild;//左右孩子的指针PointerTag LTag,RTag; //左右标志}BitNode, *Bitree;Bitree pre=NULL;Bitree point[MAX+1];int CreatBiTree(Bitree &T)//先序创建二叉树{ //该节点非空返回1,双亲节点对应标志Link,//空时返回0,双亲节点对应标志应为Threadchar ch;cout<<"输入结点元素(#表示空):";cin>>ch;if(ch=='#'){T=NULL;return 0;}else{if(!(T=(BitNode *)malloc(sizeof(BitNode)))) {cout<<"存储分配失败"<<endl;exit(1);}T->data=ch;if(CreatBiTree(T->lchild))T->LTag=Link;elseT->LTag=Thread;if(CreatBiTree(T->rchild))T->RTag=Link;elseT->RTag=Thread;}return 1;}void InThreading(Bitree p)//中序遍历线索化二叉树{if(p!=NULL){InThreading(p->lchild);//左子树线索化if(p->lchild==NULL) //前驱线索{p->LTag=Thread;p->lchild=pre;}if(pre->rchild==NULL)//后继线索{pre->RTag=Thread;pre->rchild=p;}pre=p; //保持pre指向p的前驱InThreading(p->rchild);//右子树线索化}}int InOrderThreading(Bitree &Thrt,Bitree T){//中序遍历线索化二叉树T,并将其中序线索化,Thrt指向头节点Thrt=(Bitree)malloc(sizeof(BitNode)); //申请头结点地址if(Thrt==NULL) exit(1);Thrt->LTag=Link; //建立头结点Thrt->RTag=Thread;Thrt->rchild=Thrt;//右指针回指if(T==NULL)Thrt->lchild=Thrt;//若二叉树为空,则左指针回指else{Thrt->lchild=T;pre=Thrt;InThreading(T); //中序遍历线索化二叉树pre->rchild=Thrt;pre->RTag=Thread;//最后一个结点的线索化Thrt->rchild=pre;}return 1;}Bitree InPre(Bitree p)//前驱{Bitree q;q=p->lchild;if(p->LTag==Thread)return(p->lchild);if(q==NULL){return NULL;}while(q->RTag==Link){q=q->rchild;}return (q);}Bitree InNext(Bitree p)//后继{Bitree q;q=p->rchild;if(p->RTag==Thread)return(p->rchild);if(q==NULL){return NULL;while(q->LTag!=Thread){q=q->lchild;}return(q);}int Traverse_Thr(Bitree T){int i=0;Bitree p;p=T->lchild;cout<<"1--代表是,0--代表否"<<endl;cout<<"是否有"<<"前驱"<<"节点"<<"是否有"<<"后继"<<"顶点序号"<<endl;cout<<" 前驱"<<" "<<"节点"<<"后继"<<"while(p!=T)//空树或遍历结束时p==T{while(p->LTag==Link)p=p->lchild;//找开始结点cout<<p->LTag<<" ";if(p->LTag==Thread){cout<<InPre(p)->data<<" ";}elsecout<<" ";cout<<p->data<<" ";point[i++];cout<<p->RTag<<" ";if(p->RTag==Thread)cout<<InNext(p)->data<<" ";elsecout<<" ";cout<<i<<endl; point[i]=p;while(p->RTag==Thread&&p->rchild!=T)//寻找后继结点{p=p->rchild;cout<<p->LTag<<" ";if(p->LTag==Thread){cout<<InPre(p)->data<<" ";}elsecout<<" ";cout<<p->data<<" ";point[i++];cout<<p->RTag<<" ";if(p->RTag==Thread)cout<<InNext(p)->data<<" ";elsecout<<" ";cout<<i<<endl;point[i]=p;}p=p->rchild;}return i;}int main(){Bitree T,Thrt,prenode,Nextnode;int n,index;char str;cout<<"先序创建二叉树"<<endl;CreatBiTree(T);cout<<endl;InOrderThreading(Thrt,T);n=Traverse_Thr(Thrt);do {cout<<"请输入你要查找节点的序号(按中序输出时的序号)"<<endl;cin>>index;if(index<0||index>n){cout<<"请输入数的序号大于0并小于等于节点数"<<endl;return 0;}prenode=InPre(point[index]);Nextnode=InNext(point[index]);if(point[index]->LTag==Thread)cout<<"你要查找第"<<index<<"个节点的前驱结点为"<<prenode->data<<endl;elsecout<<"你要查找第"<<index<<"个节点无前驱结点"<<endl;if(point[index]->RTag==Thread)cout<<"你要查找第"<<index<<"个节点后继结点为"<<Nextnode->data<<endl;elsecout<<"你要查找第"<<index<<"个节点无后继结点"<<endl;cout<<"你是否要继续?y--是;n--否"<<endl;cin>>str;}while(str=='Y'||str=='y');return 0;}3.宿舍管理查询软件(**)任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:(1)采用交互工作方式(2)可以增加、删除、修改信息(3)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(选择、快速排序、堆排序等任选一种)(4) 查询 : a.按姓名查询 ;b.按学号查询 ;c按房号查询(5) 打印任一查询结果(可以连续操作)㈠、数据结构与核心算法的设计描述#include<iostream.h>#include<string.h>#include<stdlib.h>#define MAXSIZE 100int n;typedef struct //学生结构体的定义{int num;//学号char name[10];//姓名char room[10];//房号}Student;typedef struct SqList//顺序表结构体的定义{Student Stu[MAXSIZE+1];//定义一个存放学生信息的数组}SqList;void CreatInfo(SqList &L) //建立学生信息void print(SqList &L)//输出顺序表void Insertsort(SqList &L)//直接插入排序(房号优先)void InPut(SqList &L)//添加新的学生信息int Partition(SqList &L,int i,int j)//快速排序void Quicksort(SqList L,int low,int high)//快速排序void Selectsort(SqList &L)//选择排序(姓名优先) void find(SqList &L,int n)//查找修改学生并打印㈡、程序调试及运行结果分析1.建立学生信息2.插入学生信息并插入排序(房号优先)3.选择排序(姓名优先)4.快速排序5.查找修改学生并打印㈢、程序清单#include<iostream.h>#include<string.h>#include<stdlib.h>#define MAXSIZE 100int n;typedef struct //学生结构体的定义{int num;//学号char name[10];//姓名char room[10];//房号}Student;typedef struct SqList//顺序表结构体的定义{Student Stu[MAXSIZE+1];//定义一个存放学生信息的数组}SqList;void CreatInfo(SqList &L){cout<<"请输入你要创建的学生数:"<<endl;cin>>n;cout<<"学生的信息:"<<endl;cout<<"姓名学号房号:"<<endl;for(int i=1;i<=n;i++){cin>>L.Stu[i].name>>L.Stu[i].num>>L.Stu[i].room;}}void print(SqList &L)//输出顺序表{cout<<"输出学生信息:"<<endl;for(int i=1;i<=n;++i){cout<<L.Stu[i].name<<" "<<L.Stu[i].num<<" "<<L.Stu[i].room<<endl;}}void Insertsort(SqList &L)//直接插入排序(房号优先){int i,j;for(i=2;i<=n;++i)if(strcmp(L.Stu[i].room,L.Stu[i-1].room)<0){L.Stu[0]=L.Stu[i];for(j=i-1;strcmp(L.Stu[0].room,L.Stu[j].room)<0;--j)L.Stu[j+1]=L.Stu[j];L.Stu[j+1]=L.Stu[0];}}void InPut(SqList &L){n++;cout<<"输入学生的信息:"<<endl;cout<<"姓名学号房号:"<<endl;cin>>L.Stu[n].name>>L.Stu[n].num>>L.Stu[n].room;}int Partition(SqList &L,int i,int j)//快速排序{Student p;L.Stu[0]=L.Stu[i];p=L.Stu[i];while(i<j){while(i<j &&L.Stu[j].num>=p.num)j--;L.Stu[i]=L.Stu[j];while(i<j &&L.Stu[i].num<=p.num)i++;L.Stu[j]=L.Stu[i];}L.Stu[i]=p;return i;}void Quicksort(SqList L,int low,int high)//快速排序{int location;if(low<high){location=Partition(L,low,high);Quicksort(L,low,location-1); //对左区间递归排序Quicksort(L,location+1,high); //对右区间递归排序}}void Selectsort(SqList &L)//选择排序(姓名优先){Student t;int i,j,k;for(i=1;i<=n;i++){k=i;for(j=i+1;j<=n;j++)if(strcmp(L.Stu[j].name,L.Stu[k].name)<0)k=j;if(k!=i){t=L.Stu[i];L.Stu[i]=L.Stu[k];L.Stu[k]=t;}}}void find(SqList &L,int n)//查找学生信息{int t,m=1,i;char ch,a;cout<<"请输入你要查找的学号:"<<endl;cin>>t;cout<<"该学生的信息为:"<<endl;while(m<=n&&L.Stu[m].num!=t)m++;if(L.Stu[m].num==t){cout<<"学号是:"<<L.Stu[m].num<<"\t姓名:"<<L.Stu[m].name<<"\t房号:"<<L.Stu[m].room<<endl;cout<<"是否修改信息(Y/N):";cin>>a;if(a=='y'||ch=='Y'){cout<<"1.修改学号"<<endl;cout<<"2.修改姓名"<<endl;cout<<"3.修改房号"<<endl;cout<<"请选择:";cin>>i;switch(i){case 1:cout<<"输入修改学号:";cin>>L.Stu[m].num;break;case 2:cout<<"输入修改姓名:";cin>>L.Stu[m].name;break;case 3:cout<<"输入修改房号:";cin>>L.Stu[m].room;break;default:cout<<"输入错误!"<<endl;}}}elsecout<<"没有你要查找的学生!"<<endl;cout<<"是否打印学生信息(Y/N):";cin>>ch;if(ch=='y'||ch=='Y')print(L);}int main(){SqList L;int k;CreatInfo(L);//创建学生信息print(L);//按输入顺序打印出顺序表loop: cout<<"请选择排序方式:"<<endl;cout<<"1 插入学生信息"<<endl;cout<<"2 插入排序(房号优先)"<<endl;cout<<"3 选择排序(姓名优先)"<<endl;cout<<"4 快速排序"<<endl;cout<<"5 按查找修改学生并打印"<<endl;cout<<"0 退出排序程序"<<endl;cin>>k;if(k!=0){switch(k){case 1:InPut(L);break;case 2:Insertsort(L);//进行插入排序print(L);break; //输出插入排序后的顺序表case 3:Selectsort(L);//进行选择排序print(L);break;//输出排序后的顺序表case 4:Quicksort(L,1,n);//选择快速排序print(L);break;//输出排序后的顺序表case 5:find(L,n);break;//查找学生信息default:cout<<"输入错误!"<<endl;}}cout<<endl;goto loop;return 0;}4.停车场管理(**)任务:设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
《数据结构》课程设计报告

《数据结构》课程设计报告课程设计报告----数据结构学院:软件学院班级:11级二班学号:54110211姓名:刘海鲸辅导老师:刘亚波老师《数据结构》课程设计报告姓名:刘海鲸学号:54110211实验室:座位号:提交日期:2013.3.13成绩:指导教师:刘亚波问题解析(对问题的分析、解题思路与解题方法):实验目的为使我们学习完数据结构课程后,全面深入理解数据结构知识,掌握应用技巧,提高应用与分析能力,并培养学生综合运用所学理论知识求解问题的能力和协作精神。
解题思路(分析):题目要求独立编写程序,完成对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序6种内排序算法的比较,并且使用至少5组不同的输入数据(记录个数不小于1000个,其中包括完全正序,完全逆序和无序情况)进行排序,比较各组记录与各种排序方法在关键字比较次数和关键字移动次数这两个指标上的差异。
因此只需对文件进行排序并计算出两项指标针对某一组特定数据在不同排序方法中的值,既可以完成题目要求。
编写正确的排序算法,使用程序读取不同文件,并定义变量,记录排序过程中两项指标的值,就是本题的解题思路。
解题方法:使用Code::blocks作为本次实验的开发工具,使用C++完成程序。
首先使用数据产生程序来产生所需的5个数据文件,使用了C++中cstdlib文件中的rand()函数和srand()函数共同产生3组伪随机数;在另一个工程中创建了data.h与control.h两个头文件和main.cpp源文件,其中data.h定义了数据类型(模板类),包括主要的排序函数和数据成员,control.h定义了控制类,来完成界面控制,数据文件读取和排序功能的实现,main.cpp是对控制类对象的控制函数conmian()的调用来完成整个程序。
最后运行程序来完成对比较指标的统计并进行分析,对得出结果进行解释。
任务分工:本实验由本人独立完成。
进度安排:为第一次实验课将6个内排序算法完成并调试成功,周末之前完成界面控制并对排序结果进行分析,第二次实验之前完成课程设计报告,第二次试验对程序结果进行最后检查并提交实验报告。
数据结构课程设计报告

课程设计题目:哈夫曼树的应用及单链表的基本操作一、课程设计目的1、熟悉C语言程序的编辑、编译链接和运行的过程,至少能够用一种编译器较熟练地编辑、编译及调试程序。
2、综合应用所学的计算机基础知识和所掌握的程序设计语言。
3、学习并掌握程序设计语言中指针、链表的定义操作,构造哈夫曼树的相关操作。
4、自行设计并实现一个较为完整的对文本文件进行编码、解码的设计与开发。
5、通过系统分析、系统设计、编程实现,写实验报告等环节,初步掌握软件系统的设计方法和步骤。
6、锻炼大家灵活运用程序语言进行软件开发的初步能力,提高分析问题和解决问能力。
7、综合应用程序设计语言的知识,实现一个完整的系统,提高编程能力,体会软件程序的开发过程。
8、培养学生独立完成程序课程设计的能力,提高程序设计水平。
二、课程设计内容1、使用哈夫曼树和哈夫曼编码的有关知识设计一个哈夫曼编/译码器(附一单链表基本操作系统)(1)读取文本文件,并统计文件中字母个数。
(2)建立huffman树。
(3)对文件进行huffman编码:文本文件◊统计字母个数◊建立哈夫曼树◊建立哈夫曼编码(利用已经建立好的哈夫曼树)◊读取文件,对文件进行哈夫曼编码,并将每个字母对应的哈夫曼编码写入到一个新文件。
(4)对文件进行huffman解码:读取存放哈夫曼编码的文件◊解码◊将解码后的字母存入新文件中。
(5)结果:比较源文件和解码后的文件是否一致。
2、采用线性表的链式存储结构,做一单链表基本操作系统,完成对信息的插入,删除、逆置的操作。
3、执行编译操作,并根据提示调试此程序,排除所有的错误和警告,直到编译成功为止。
4、执行运行操作,逐一对每个模块进行调试,直到全部程序运行成功为止。
5、请老师检查,向老师演练此程序,并能回答老师提出的相关问题。
三、需求分析1、问题背景:哈夫曼树是一类带权路径长度最短的树,将其应用在信息编码中,权值可看作是某个符号出现的频率,出现频率大的字符其编码长度小,从而可缩短整个信息通信过程中的二进制编码长度,达到节省通信资源的目的。
数据结构课程设计报告

课程设计报告课程:数据结构学号: ________________ 姓名: ________________ 班级:______________教师:_______________ 时间:______计算机科学与技术系职工对彖包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中査询符合某些条件的职工。
(4)修改:检索某个职工对象,对苴某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
设计所用软件环境或器材、原理与说明: Windows 7, Microsoft Visual C++6.0问题的模型化描述及求解算法的简要描述:根据职工管理系统问题的描述和详细需求分析,要达到上述功能,链表的数据结构来存储职工信息,并对其进行相应的插入、删除、修改、查询、排序、保存等操作。
(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职丄信息系统的抽象数据类型,其中职丄信息以链表的存储方式实现。
(2)系统处理功能的实现:系统管理员根据公司的人员流动惜况,在提示信息的提示下,选择相应的服务进行操作。
(3)输出的实现:根据选择的操作,输出与之对应的信息。
综上可以绘制出职工管理问题的系统流程图,如图1所示査询职 工信息 图1系统流程图 根据职工管理系统问题的分析和设计要求,可以得到该职1:管理系统可以分为五 个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息 查询模块、职丄信息排序模块。
其系统功能结构如图2所示。
输入职工人数 和对应的信息图2系统功能结构图总控模块测试模块 输出模块开始显示主菜氓提 示职工信 息排序 修改职工信息软件组成及使用说明:主函数设计根据详细设计要求,可以得到主函数代码及其对应的程序流程图:在主函数中,实现了友好的界面设计。
数据结构课程设计报告

数据结构课程设计报告1. 引言在计算机科学领域中,数据结构是指组织和存储数据的方式,以便于使用和管理。
数据结构的设计和实现对于编程任务的效率和性能具有重要的影响。
本篇报告将针对我们在数据结构课程中的设计项目进行说明和总结。
2. 选题背景我们的选题是实现一个图书馆管理系统,旨在帮助图书馆更好地管理图书借阅和归还的流程。
这个系统涉及到图书馆的各个方面,包括图书的分类、借阅记录、读者信息等。
通过实现该系统,我们希望进一步理解和应用数据结构的概念和方法。
3. 数据结构的选择为了实现图书馆管理系统,我们需要选择合适的数据结构来组织和存储相关数据。
在该系统中,我们选择了以下几种数据结构:- 数组:用于存储图书的基本信息,如书名、作者、出版社等。
数组的随机访问特性使得可以快速地获取某本书的信息。
- 链表:用于存储读者的信息和借阅记录。
链表的插入和删除操作比较高效,符合图书馆管理系统中动态变化的需求。
- 栈:用于实现借书还书的操作。
栈的后进先出特性使得操作的顺序可以得到有效的控制。
4. 系统功能我们的系统包括以下功能:- 图书信息管理:包括添加图书、删除图书、更新图书信息等功能。
通过数组和链表的结合使用,我们可以实现对图书信息的动态管理。
- 读者信息管理:包括添加读者、删除读者、查询读者信息等功能。
同样使用链表结构,可以快速记录和查询读者的信息。
- 借阅和归还处理:通过栈的结构,实现借阅图书和归还图书的操作。
栈的先进后出特性确保了操作的顺序合理且安全。
- 查询功能:可以根据图书的编号、作者、出版社等条件进行图书和读者的查询操作。
通过数组和链表的结合,实现了高效的查询功能。
5. 实现过程与挑战在实现该系统的过程中,我们遇到了许多挑战。
其中一个主要的挑战是如何处理并发操作,例如同时有多个读者同时借阅图书或者查询图书的情况。
我们通过引入互斥锁和条件变量等机制,确保了数据的一致性和正确性。
6. 总结与展望通过本次的数据结构课程设计项目,我们深入了解了数据结构的应用和实践。
数据结构课程设计报告pdf

数据结构课程设计报告pdf一、课程目标知识目标:1. 让学生掌握数据结构的基本概念,包括线性表、树、图等结构的特点和应用场景。
2. 使学生了解常见的数据结构算法,如排序、查找等,并能运用到实际问题中。
3. 帮助学生理解算法复杂度分析,包括时间复杂度和空间复杂度,能够评估算法的优劣。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,能够根据问题选择合适的数据结构进行建模。
2. 提高学生的编程能力,使其能够熟练地使用所学数据结构编写高效、可读性强的代码。
3. 培养学生独立分析和解决问题的能力,通过实际项目案例,学会运用所学知识进行系统设计。
情感态度价值观目标:1. 培养学生对计算机科学的兴趣和热情,激发他们主动探索数据结构及相关领域的欲望。
2. 培养学生的团队协作精神,学会在团队中沟通、分工与合作,共同完成任务。
3. 培养学生具备良好的编程习惯,注重代码规范和优化,提高代码质量。
课程性质:本课程为高年级专业核心课程,旨在帮助学生建立扎实的计算机科学基础,提高编程能力和问题解决能力。
学生特点:学生具备一定的编程基础,具有较强的逻辑思维能力,对数据结构有一定了解,但尚需深入学习和实践。
教学要求:结合学生特点,课程注重理论与实践相结合,强调动手实践和实际应用。
通过案例分析和项目实战,使学生掌握数据结构的核心知识,提高解决实际问题的能力。
教学过程中,关注学生的个体差异,提供个性化指导,确保课程目标的达成。
二、教学内容本课程教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、链表、树、图等结构的特点和基本操作。
2. 算法复杂度分析:时间复杂度和空间复杂度,常见算法复杂度分析。
3. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序等。
4. 查找算法:顺序查找、二分查找、哈希查找等。
5. 树和图的应用:二叉树、平衡树、图的基本算法(深度优先搜索、广度优先搜索等)。
6. 线性表的应用:栈和队列的应用,链表操作等。
《数据结构》课程设计报告

《数据结构》课程设计报告《数据结构》课程设计报告如下:一、课程设计分析在学习了数据结构课本理论知识后,为了检验自己所学知识的牢固性巩固大家的理论知识,调动大家的编程兴趣;同时为大家提供一个实践自己,检验自己的平台,以增加大家对将来工作的适应能力;也为了锻炼大家的动手实践能力,遂在学期末进行了本次课程设计。
“数据结构”在计算机科学中是一门综合性的专业基础课。
“数据结构”的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为“数据结构”是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。
在计算机科学中,“数据结构”不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。
我们本着自己的兴趣及挑战自己的态度,也为检验我们理论知识的熟练度,锻炼我们动手实践能力,我们选择了小型图书管理系统的编写。
因为我们生活在大学,图书馆是我们学习的天堂,借书和还书又是必不可少的,一个好的图书管理系统对于我们学生和管理人员都会为大家提供很多便利。
本着挑战和创新的思想,我们进行了此次课程设计程序编写及报告撰写。
二、课程设计基本理论运用所学的数据结构相关内容,设计一个小型图书馆管理系统,我们将运用到的原理有:链表的操作,包括插入,删除等;还有数据的排序;文件的操作等;遍历查找,插入排序等原理。
也运用了c语言的基本图形界面,使用户使用界面更加人性化,更加美观。
数据结构的创建是本课程设计的一个重要内容,我们这里使用的是单链表的数据结构,结合c语言语言特点、实际的图书馆管理系统的基本操作实现了一个简单的图书管理系统的正常运行,实现一些简单的功能。
三、课程算法设计通过对图书管理系统内的图书进行添加和删除操作,实现同学借书和还书的记录工作,通过对图书的查找和按指定方式排序,更有利于同学们挑选自己所需要的图书,借阅借书所需时间。
数据结构课程设计完整版

西安郵電學院数据结构课程设计报告题目:魔王语言翻译/多项式相乘系部名称:专业名称:班级:学号:学生姓名:指导教师:时间:一、课程设计目的通过本次课程设计,强化上机动手能力,使我们在理论和实践的基础上进一步巩固《C语言程序设计》、《数据结构——使用C语言》课程学习的内容,初步掌握工程软件设计的基本方法,熟知链表,栈,队以及文件的使用方法,学会将知识应用于实际,提高分析和解决问题的能力,为毕业设计和以后工作打下基础。
二、课程设计内容【1】、魔王语言问题描述有一个魔王总是使用自己的一种非常精炼的而抽象的语言讲话,没有人能听懂。
但他的语言是能够逐步解释成人能听懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 …… θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听懂的话。
基本规则现在有以下三种规则,设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写替换的变量。
魔王语言可含人的词汇。
(1)B->tAdA(2)A->sae(3)示例:魔王说:B(ehnxgz)B解释成人的语言:tsaedsaeezegexenehetsaedsae若每个小写字母含义如下表示:t d s a e z g x n h天地上一只鹅追赶下蛋恨则魔王说的话是:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅【2】、多项式相乘问题描述用带头结点的动态单链表来表示多项式,在此基础上完成多项式的乘法运算。
三、需求分析对所开发系统功能、性能的描述,想要实现的目标。
【1】魔王语言有一个魔王总是使用自己的一种非常精炼的而抽象的语言讲话,没有人能听懂。
但他的语言是能够逐步解释成人能听懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计手册一、 栈的使用(一)需求分析本程序通过java 语言完成栈的构造,对堆栈的数据进行基本的存储操作。
具体包括,数据的入栈、出栈、读取等。
入栈操作:要求用户从键盘出入要进栈的数值或字符,对栈满的情况作出提示。
出栈操作:删除栈顶元素,并将删除的数据或字符在运行结果中显示。
对栈空的情况作出提示。
读取操作:在插入和删除的任意阶段都可讲栈中的元素读取出来,能够实现对栈中的数据元素个数进行统计。
(二)概要设计1.为了实现上述程序功能,需要定义栈的数据类型有: static int MAX=5;static String[] item =new String[MAX]; static int top; 2.本程序包含4个函数Push() 初始条件:栈未满 操作结果:往栈中插入数据; Pop() 初始条件:存在非空栈 操作结果:将栈中的数据删除;Get() 初始条件:存在非空栈 操作结果:显示非空栈中的所有元素; Main() 操作结果:调用以上函数。
程序流程图:Main() Pop()Push() Get()(三)详细设计具体代码见Stack.java基本操作:Stack()构造一个空的栈,初始状态top的指针为-1;入栈方法public static void push()。
该方法中,首先判断是否栈满(top>=MAX-1),如果栈满,则输出提示语“栈满 ,栈中最多能容纳5个元素”,否则从键盘输入数据,并且top指针加1。
出栈方法public static void pop()。
首先判断是否栈空(top<0),如果栈空,则输出提示信息“栈空 ,没有可操作的元素”,否则删除栈顶元素。
Top指针减1。
get()方法public static void get()。
如果栈非空,则显示栈中的元素,并通过count计算出栈中的元素个数。
主函数public static void main()通过switch-case语句调用相应的方法,从而实现栈的全部操作。
(四)调试分析通过在主函数中顺序调用相关函数来测试相关算法的,测试结果如下:1、测试入栈算法如果遇到栈满的情况,则运行结果为2、测试出栈算法如果栈空,则运行结果为3、获取栈中元素的测试结果已在1和2的测试中体现二、哈夫曼树的使用(一)需求分析该程序旨在实现对任意一个权值集合进行哈夫曼树的构造,对已经建好的哈夫曼树进行编码,并将每个字符的编码输出。
(二)概要设计1、哈夫曼树节点的数据类型定义class HaffmanNode {int weight;int parent,left,right;}2、实现构造哈夫曼树具有n个叶子结点的哈夫曼树共有2n-1个结点。
在已知结点总数的情况下采用采用三叉静态链表存储哈夫曼树。
我把节点信息存放在数组中,用数组weight[i]来存储每个叶子的权值。
3、获得哈弗曼编码在构造哈夫曼树之后,求每一个字符的编码是需要走一条从叶子节点出发、走一条从叶子节点到根节点的路径:译码需要从根节点到叶子节点的路径。
字符的哈弗曼编码由变长的二进制为串组成,每一个字符的哈弗曼编码用一个字符串表示,用HuffmanTree类的huffmanCode()发放返回当前哈夫曼树中的多有叶子结点表示字符的哈弗曼编码。
(三)详细设计详细代码见HaffmanTree.java(四)调试分析运行结果:程序的不足:输入的权值个数不能按照用户的要求,规定数组的容量为5,所以用户只能按照程序的要求输入任意5个数字,而且只能对数值型数据进行编码,如果输入字符串,则抛出异常。
三、队列的使用(一)需求分析本程序通过java 语言完成队列的构造,对队列的数据进行基本的存储操作。
具体包括,数据的入队、出队、读取等。
入队和出队操作均由用户通过键盘控制,将操作结果在运行窗口中显示。
具体的操作前先对循环队列中的具体情况进行判断,并作出相应的提示,如“队满”,“队空”等。
只要队列非空,读取操作在插入和删除的任意阶段都可将队列中的元素显示,并实现对队列中的数据元素个数进行统计。
(二)概要设计1.为了实现上述程序功能,需要定义栈的数据类型有:int MaxSize =5;static String queue []=new String[MaxSize ]; static int front ,rear ;2.本程序包含4个函数enqueue() 初始条件:队列未满 操作结果:往循环队列中插入数据; dequeue() 初始条件:存在非空队列 操作结果:将队列中的数据删除; Get() 初始条件:存在非空队列 操作结果:显示非空队列中的所有元素; Main() 操作结果:调用以上函数。
程序流程图:Main() Pop()Push() Get()(三)详细设计具体代码见queue.java1、入对方法public static void enqueue()。
该方法中,首先判断是否队满(rear+1)%MaxSize==front),如果队满,则输出提示语“Queue Full!”,否则从键盘输入数据,并且rear指针加1。
2、出队方法public static void dequeue()。
首先判断是否队空(front==rear),如果队空,则输出提示信息“队空”,否则删除队头元素。
Rear 指针减1。
3、get()方法public static void get()。
如果队列非空,则显示队中的元素,并通过count计算出队列中的元素个数。
4、主函数public static void main()通过switch-case语句调用相应的方法,从而实现队列的全部操作。
(四)调试分析通过在主函数中顺序调用相关函数来测试相关算法的,测试结果如下:1、测试入队算法如果遇到队满的情况,则运行结果为2、测试出队算法如果队空,则运行结果为:a)获取环行队列中元素的测试结果已在1和2的测试中体现b)4、问题分析:输入的元素中多了一个NULL,如以上运行结果的截图所示。
用count统计的元素个数比实际队列中的个数多一。
和同学探讨分析后,经过调试,发现循环输出存在问题,即get()方法里面的for循环语句出错,把i>0改成i>front+1后,一切问题都解决了。
最后得运行结果插入:删除:四、图的表示(一):需求分析有向带权图包括图形的原顶点、终点及权值,所以在定义变量时,定义destination、source、value这三个变量。
默认为0,根据用户的输入将其转化成邻接矩阵,并输出。
(二):概要设计:定义有向图的行数和列数,通过提示,要求输入者输入原顶点、对应边的权值及目标顶点。
用check()方法实现对数组的验证功能,验证两个顶点之间是否生成了自循环(source=destination),是否超出数组范围(source >= MAX || destination >= MAX)。
通过主方法将带权有向图转换为邻接矩阵。
(三):详细设计:Graph.java(四):调试分析:1、运行程序后,显示出来的界面:2、3、出现自循环时,界面如下。
4、顶点超出数组范围五、数组的使用、存储(一):需求分析运用数组存储数据,对数组实行存入数据与删除数据的操作,整个程序用Array一个类来写,下面包含add、delete、tostring、checkint、main这5个方法,main方法里创建了新的数组,在选择相关的步骤后便可对数组进行插入删除读取操作。
(二):概要设计:(三):详细设计见Array.java(四):调试分析:1、当点击开始时,出现如下界面。
2、输入1,则出现“请输入要添加的位置”3、输入正确的添加位置后,显示如下。
4、元素添加成功后,界面又回到最初的样子。
5、此图为显示所有元素的界面。
6、删除元素7、输入的位置格式发生错误时8、当某个位置有数据时,再在该位置添加数据时,原来的数据会向后移一位。
程序的缺陷:缺少结束语句。
当输入的位置不正确时,虽然显示“请正确进行选择”,但还是可以输入元素进行添加。
当某个位置有数据时,再在该位置添加数据时,原来的数据会向后移一位。
六、排序(一):需求分析1、输入的形式按需要输入学生的个数(整数形式),再输入对应的学生姓名及成绩(整数形式),如果输入形式不对,则程序立即退出。
2、输出形式在按需求选择了排序方法后,按分数高低次序输出每个学生在考试中获得的名次(分数相同的为同一名次),后面紧跟学生名字和成绩。
3、程序所能达到的功能学生的考试成绩表通过键盘输入数据建立,同时对输出进行格式控制,分别用冒泡排序、快速排序和直接选择排序算法实现对成绩的排序。
4、测试数据1)正确的输入及输出结果:输入正确的学生人数后,会要求你输入相应人数的姓名及其对应的成绩。
输入完毕后出现一条虚线以和下面内容进行划分。
在1、2、3内选择一种排序方法,确定后会显示相应的成绩排序和学生姓名、成绩。
2)错误的输入及输出结果:如果学生人数输入不对,程序立即退出,成绩输入错误也会立即退出程序。
如果输入排序方法的数字和要求的不对应,会显示“请输入正确的输入方法”;如果输入的不是数字,则会立即退出程序。
(二):设计概要(三):详细设计具体代码请见Client.java&Student.java(四):调试分析如果输入格式不对,则退出程序。
如下图1、输入学生人数格式错误2、输入排序方式格式错误3、输入成绩错误4、正确输入后,出现的排序结果排序排的只是成绩,与姓名无关,不可能把所有学生的成绩单独拿出来。
所以要对对象进行排序,也就是对Studnet排序。
JA V A中对象本身是不可以排序的,但是JA V A如果一个类实现Comparable接口的话,就可以排序了。
七、课程设计总结(一)09xxxxxx xxx由于前段时间一直在忙挑战杯的事,然后对于这个数据结构课程设计就一直拖啊拖,原本以为这个课程设计和以前上课叫我们编的小程序差不多,最后却发现还是有很大的难度的。
之前的课上作业,代码都从书上抄抄来,然后自己稍加整顿便出来结果了,这次的有些都不行。
正是由于这样,在这次的课程设计中,我对java的运用了解的更多了,对于以前学过的数据结构的内容又重拾了一遍,温故而知新。
在处理排序问题时,排序排的只是成绩,跟姓名没关系,我们不可能把所有学生的成绩单独拿出来。
如果是存放在一个数组里,然后对这个数组进行排序,这样也很麻烦。
在问了同学后,引入了对对象进行排序,也就是对Studnet排序,在JAVA中对象本身是不可以排序的,但是JAVA如果一个类实现Comparable接口的话,就可以排序了。
在处理“定义一个图,然后把它转化为邻接矩阵”在这个题目中,开始完全不知道从何下手,因为关于图的知识之前没学好,现在又有些忘了。