数据结构课程设计报告(完结)

合集下载

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

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

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。

二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。

在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。

三、实验内容本次数据结构课程设计实验主要分为以下几个部分: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). 插入排序基本思路:向有序表中插入新的元素(或记录),使之仍有序,此时表的长度也相应地发生变化。

数据结构课程设计报告

数据结构课程设计报告
{t=l.r[1].key,l.r[1].key=l.r[i].key,l.r[i].key=t;
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、需求分析:模拟某校九层教学楼的电梯系统。

该楼有一个自动电梯,能在每层停留。

九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。

乘客可随机地进出于任何层。

对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。

模拟时钟从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辆汽车的狭长通道,且只有一个大门可供汽车进出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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接口的话,就可以排序了。

在处理“定义一个图,然后把它转化为邻接矩阵”在这个题目中,开始完全不知道从何下手,因为关于图的知识之前没学好,现在又有些忘了。

相关文档
最新文档