数据结构课程设计报告

合集下载

数据结构课程设计实践报告

数据结构课程设计实践报告

数据结构课程设计实践报告数据结构课程设计实践报告1. 实验目的本次数据结构课程设计实践的目的是帮助学生掌握数据结构的基本概念,了解常见数据结构的实现原理,提高代码实现能力和问题解决能力。

2. 实验背景数据结构是计算机科学的基础课程,它是计算机科学的重要组成部分。

在计算机科学中,数据结构是针对计算机中的数据存储、管理和操作的方法论。

数据结构中的“数据”是指计算机中存储的各种信息,而“结构”则是指这些信息之间的相互关系。

常见的数据结构包括数组、链表、栈、队列、树和图等。

3. 实验内容本次数据结构课程设计实践包括以下内容:3.1 栈和队列实现一个基于栈和队列的计算器程序,能够进行加减乘除等基本运算和括号运算。

3.2 链表与树实现一个简单的文件系统,包括文件的创建、删除、移动、复制等操作,利用链表实现文件存储,利用树来实现文件目录结构。

3.3 图实现最短路径算法,并利用Graphviz工具将结果可视化展示出来。

4. 实验过程我们小组首先进行了团队分工,每个成员负责一个模块的代码实现,同时进行代码审查。

我们使用C++语言进行编码实现,采用面向对象设计思想,将每个数据结构封装成一个类,方便日后的调用和扩展。

在实现栈和队列的计算器程序时,我们使用了双栈法来进行括号运算的处理,使用队列来实现多项式的存储和输出。

在实现文件系统时,我们构建了一颗树形结构来表示文件的目录结构,同时在每个节点处保存了一个链表,来存储该目录下的文件信息,方便进行操作。

在实现最短路径算法时,我们采用了Dijkstra算法,并使用Graphviz 工具将结果可视化展示出来。

5. 实验结果我们小组经过不断尝试和调试,最终实现了所有要求的功能,并达到了预期的效果。

我们在实验过程中遇到的问题,如链表的指针操作、树的遍历方法以及Dijkstra算法的实现等,我们通过文献资料的查阅和团队讨论得以解决。

6. 实验总结通过本次数据结构课程设计实践,我们加深了对数据结构的理解和掌握,同时也提高了我们的编程能力和问题解决能力。

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

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

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

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

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

三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。

2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。

3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。

4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。

5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。

四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。

2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。

通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。

3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。

链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。

在实现链表时,我们定义了一个节点结构,包含数据域和指针域。

通过指针的方式将节点连接起来,形成一个链式结构。

同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。

4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告数据结构课程设计报告设计题目:实现一个简单的通讯录管理系统设计背景:在日常生活中,我们经常需要管理并使用一些联系人的联系信息,例如电话号码、姓名、地址等。

为了方便对这些联系人进行管理和查询,我们设计了一个简单的通讯录管理系统。

设计目的:本设计旨在通过实现一个通讯录管理系统,加深对数据结构的理解和应用。

通过该系统,用户可以方便地添加、删除、修改和查询联系人信息,提高信息的管理效率和准确性。

设计原理:该系统采用基于链表的数据结构,其中每个节点存储一个联系人的信息,包括姓名、电话号码和地址。

系统提供了以下功能:1. 添加联系人:用户可以输入联系人的姓名、电话号码和地址,程序将创建一个新节点,并将其插入链表中。

2. 删除联系人:用户可以输入要删除的联系人姓名,程序将遍历链表查找到该节点,并将其删除。

3. 修改联系人信息:用户可以输入要修改的联系人姓名,程序将遍历链表查找到该节点,并允许用户修改联系人的电话号码和地址。

4. 查询联系人信息:用户可以输入要查询的联系人姓名,程序将遍历链表查找到该节点,并显示联系人的姓名、电话号码和地址。

设计过程:1. 定义联系人信息结构:创建一个结构体,包含姓名、电话号码和地址等字段的定义。

2. 定义链表节点结构:创建一个结构体,包含联系人信息和指向下一个节点的指针。

3. 实现添加联系人功能:用户输入联系人信息,程序创建一个新节点,并将其插入链表的适当位置。

4. 实现删除联系人功能:用户输入要删除的联系人姓名,程序遍历链表查找到该节点,并将其删除。

5. 实现修改联系人信息功能:用户输入要修改的联系人姓名,程序遍历链表查找到该节点,并允许用户修改联系人的电话号码和地址。

6. 实现查询联系人信息功能:用户输入要查询的联系人姓名,程序遍历链表查找到该节点,并显示联系人的姓名、电话号码和地址。

7. 设计界面显示:使用控制台界面,根据用户选择调用相应的功能函数。

设计结果:通过实验和测试,我们成功实现了一个简单的通讯录管理系统。

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

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

数据结构课程设计实验报告引言数据结构课程设计实验是为了加深对数据结构基本概念和算法的理解和掌握,通过实际操作来加深对数据结构的认识和应用能力。

本实验报告将介绍在数据结构课程设计实验中所完成的内容,包括实验目的、实验环境、实验过程、实验结果以及实验总结。

实验目的通过本次实验,旨在掌握以下内容: - 理解并掌握线性表、栈、队列、链表、二叉树等基本数据结构的概念和实现; - 熟悉数据结构的插入、删除、查找等基本操作; - 学习并掌握基本排序算法和查找算法的实现; - 通过实验加深对数据结构和算法的理解,并能够灵活运用于实际问题的解决。

实验环境本次实验在以下环境下进行: - 操作系统:Windows 10 - 编程语言:C语言 - 集成开发环境:Visual Studio Code实验过程1. 线性表的操作设计1.1 定义结构体首先,定义表示线性表的结构体,包括数据域和指向下一个结点的指针。

typedef struct Node {int data; // 数据域struct Node* next; // 指向下一个结点的指针} Node;1.2 初始化线性表编写函数以初始化一个空的线性表。

void InitList(Node** head) {*head = (Node*)malloc(sizeof(Node));(*head)->next = NULL;}1.3 插入元素编写函数以在线性表的指定位置插入元素。

```C void Insert(Node* head, int pos, int data) { if (pos < 1) { printf(。

数据结构课程设计(5篇)

数据结构课程设计(5篇)

数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。

三、具体要求1)利用完全二叉树的性质建立一棵二叉树。

(层数不小于4层)2)统计树叶子结点的个数。

3)求二叉树的深度。

4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。

四、进度安排依照教学计划,课程设计时间为:2周。

本设计要求按照软件工程的基本过程完成设计。

建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。

三个阶段时间分配的大概比例是:35: 45: 20。

五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。

其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。

4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。

5、源代码要求在关键的位置有注释,增加程序的可读性。

程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。

数据结构课程设计报告总结

数据结构课程设计报告总结

数据结构课程设计报告总结一、背景与目的数据结构是计算机科学中的一门核心课程,它涉及到如何有效地组织、存储和处理数据。

本次课程设计的目的是通过实际项目,加深对数据结构基本概念和原理的理解,提高解决实际问题的能力。

二、项目内容与实现本次课程设计,我们选择了“学生信息管理系统”作为项目主题。

该系统需要存储和管理学生信息,包括学号、姓名、年龄、成绩等。

为了满足这些需求,我们采用了多种数据结构,如数组、链表、栈、队列和二叉搜索树等。

在实现过程中,我们首先定义了学生类,包含各种属性。

然后,我们使用数组来存储学生信息。

为了方便查找,我们采用二叉搜索树对学生信息进行排序。

此外,我们还实现了添加、删除、查找和修改学生信息的功能。

三、遇到的问题与解决方案在实现过程中,我们遇到了以下几个问题:1. 如何在O(log n)的时间内查找学生信息?解决方案:我们采用了二叉搜索树来存储学生信息,从而实现了在O(log n)的时间内查找学生信息。

2. 如何有效地实现对学生信息的批量修改?解决方案:我们采用链表作为底层数据结构,对学生信息进行动态管理。

当我们需要修改大量学生信息时,只需遍历链表,修改对应节点的值即可。

3. 如何处理大量数据的存储和查询?解决方案:我们采用数据库作为存储系统,将学生信息存储在数据库中。

通过编写SQL语句,我们可以方便地对学生信息进行查询和修改。

四、总结与展望通过本次课程设计,我们不仅加深了对数据结构基本概念和原理的理解,还提高了解决实际问题的能力。

在实现过程中,我们学会了如何将理论知识应用到实际项目中,也意识到了数据结构在软件开发中的重要性。

展望未来,我们将继续深入学习数据结构相关知识,努力提高自己的编程能力和算法水平。

同时,我们也希望能够将所学的数据结构知识应用到更多的实际项目中,为软件开发做出更大的贡献。

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告标题:数据结构课程设计报告摘要:本报告旨在详细描述数据结构课程设计的过程和结果。

通过对数据结构的学习和实践,我们掌握了基本的数据结构知识,并运用所学知识完成了一个实际的项目。

本报告将介绍项目的背景、需求分析、设计思路、实现过程和测试结果,并对项目的优缺点进行评估和总结。

1. 引言在现代计算机科学领域,数据结构是一门基础而重要的课程。

它研究数据的组织、存储和管理方式,对于提高程序效率和解决实际问题具有重要意义。

本课程设计旨在通过实践,加深对数据结构的理解并掌握其应用。

2. 背景在本次课程设计中,我们选择了一个实际的问题作为研究对象,即一个学生信息管理系统。

该系统需要能够对学生的基本信息进行存储、查询和修改,并提供相应的功能操作。

3. 需求分析在需求分析阶段,我们对学生信息管理系统的功能和性能需求进行了详细的调研和分析。

通过与用户的交流和讨论,我们确定了以下需求:- 学生信息的录入和存储:包括学生姓名、学号、性别、年龄等基本信息;- 学生信息的查询和展示:支持按照学号、姓名等条件进行查询,并能够将查询结果以表格形式展示;- 学生信息的修改和删除:允许用户对已录入的学生信息进行修改和删除操作;- 数据的持久化存储:保证学生信息的长期保存,并能够在系统重启后恢复数据。

4. 设计思路基于需求分析的结果,我们设计了以下数据结构和算法:- 学生信息的存储:采用链表数据结构,每个节点表示一个学生的信息,包括学号、姓名、性别、年龄等字段;- 查询功能的实现:通过遍历链表,按照用户指定的条件进行匹配,返回满足条件的学生信息;- 修改和删除功能的实现:通过遍历链表,找到目标学生节点,进行相应的修改或删除操作;- 数据持久化存储:将学生信息保存在文件中,实现数据的长期保存和恢复。

5. 实现过程在实现阶段,我们使用C++编程语言,利用所学的数据结构知识逐步完成了学生信息管理系统的开发。

具体步骤如下:- 定义学生信息的数据结构:创建一个包含学号、姓名、性别、年龄等字段的结构体;- 实现学生信息的录入和存储功能:通过链表数据结构,将学生信息存储在内存中;- 实现学生信息的查询和展示功能:按照用户指定的条件遍历链表,返回满足条件的学生信息;- 实现学生信息的修改和删除功能:通过遍历链表,找到目标学生节点,进行相应的修改或删除操作;- 实现数据的持久化存储功能:将学生信息保存在文件中,实现数据的长期保存和恢复;- 进行系统测试和调试:通过输入不同的测试数据,验证系统的功能和性能。

数据结构课程设计报告

数据结构课程设计报告

目录1、需求分析说明 (2)1.1所需完成的任务及要求1.2程序实现的功能2、总体设计 (3)2.1 总体设计说明2.2 总体流程图2.3各主程序详细流程图3、详细设计 (7)3.1使用的算法思想3.2各个算法的效率简析3.3 UML图4、实现部分 (12)4.1程序算法的代码5、程序测试 (21)5.1程序运行的主界面5.2 各算法运行界面5.3 调试分析6、总结 (24)1、需求分析说明排序是数据处理中经常遇到的一种重要操作。

然而排序的算法有很多,各有其优缺点和使用场合。

本程序的设计的主要目的是通过比较各种内部排序(包括:插入法排序、起泡法、选择法、快速法、合并法排序)的时间复杂度,即元素比较次数和移动次数,来分析各种算法优缺点和适合排列何种序列。

达到在实际应用中选择合适的方法消耗最短的时间完成排序。

基本功能如下:(1)界面友好,易与操作。

采用菜单或其它人机对话方式进行选择。

(2)实现各种内部排序。

包括冒泡排序,直接插入排序,直接选择排序,希尔排序,快速排序,排序。

(3)待排序的元素的关键字为整数。

可用随机数据和用户输入数据作测试比较。

比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。

(4)演示程序以人机对话的形式进行。

每次测试完毕显示各种比较指标的列表,以便比较各种排序的优劣。

1.1所需完成的任务及要求任务:1)用程序实现插入法排序、起泡法、选择法、快速法、合并法排序;2)输入的数据形式为任何一个正整数,大小不限。

要求:排序后的数组是从小到大的;1.2程序实现的功能(1)使用随机函数实现数组初始化,生成多组元素个数不同的数组;(2)用列表打印出每种排序下的各趟排序结果;(3)打印使用各种排序算法以后元素比较和交换的次数;(4)设计合理的打印列表来打印。

2、总体设计(从总体上说明该题目的框架,用文字和图表说明)2.1 总体设计说明采用直接插入,冒泡,直接选择,快速,合并的方法实现各种排序算法,并且在实现过程中插入适当变量来实现计数元素交换次数和比较次数的统计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

井冈山大学电子与信息工程学院数据结构课程设计报告( 2012——2013年度第一学期)课程名称:数据结构课程设计题目一:6.3“哈夫曼树”的建立及其应用题目二: 3.4.6括号匹配的检验院系:计算机科学系班级:10计本(一)班姓名:刘晓倩学号:100911012指导教师:孙凌宇老师成绩:2012 年月日成绩评定一、指导教师评语二、成绩指导教师:日期:年月日设计题目<一>: 6.3“哈夫曼树”的建立及其应用一、设计要求1.问题描述设有一段电文由字符集{A,B,C,D,E,F,G,H}组成,各字符在电文中出现的次数集为{5,29,7,8,14,23,3,11},试设计各字符的哈夫曼编码。

2.需求分析(1)设计哈夫曼树。

具体的构造方法如下:以字符集{A,B,C,D,E,F,G,H}作为叶子结点,以各字符出现的次数{5,29,7,8,14,23,3,11}作为各叶子结点的权值构造一棵哈夫曼树。

(2)设计哈夫曼编码。

按照构造出来的哈夫曼树,规定哈夫曼树的左分支为0,右分支为1,则从根结点到每个叶子结点所经过的分支对应的0和1组成的序列便为该结点对应字符的哈夫曼编码。

二、概要设计1.主界面设计运行界面如图1所示:图1哈夫曼编码主菜单2.存储结构设计对于哈夫曼编码问题,希望在构造哈夫曼树的同时能方便地实现从双亲结点到左右孩子结点的操作,在进行哈夫曼编码时又要求能方便地实现从孩子结点到双亲结点的操作。

因此,本程序选择树的双亲孩子表示法作为哈夫曼树的存储结构,并加入了指示结点权值的信息。

3.系统功能设计本程序完成了从哈夫曼树的构造到实现并输出哈夫曼编码的过程,分别由两个子程序完成,其设计如下:(1)选择权值最小的树。

选择权值最小的树由函数Select()实现。

该功能按照哈夫曼树的构造步骤,在当前已构成的n(n>=2)棵二叉树的集合中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树。

(2)哈夫曼编码。

哈夫曼编码由函数HuffmanCoding( )实现。

该功能首先调用函数Select()实现哈夫曼树的构造,然后从叶子到根逆向根据哈夫曼编码的要求,一次求出每个字符的哈夫曼编码。

三、模块设计1.模块设计本程序包含3个模块:主程序模块、哈夫曼编码模块和选择模块。

其调用关系如图2所示。

图2 模块调用示意图2.系统子程序及功能设计本程序共设置3个子程序,各子程序的函数名及功能说明如下。

(1)void Select(HuffmanTree &HT,int m,int *s1,int *s2)//选择权值最小的两个结点(2)void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)//构造哈夫曼编码(3)void main( ) //主函数。

输入结点个数及权值,调用哈夫曼编码模块函数3.函数主要调用关系图本程序3个子程序之间的主要调用关系如图3所示。

图中数字是各函数的编号图3系统函数调用关系图四、详细设计1.数据类型定义typedef struct{unsigned int weight; //用来存放各个结点的权值unsigned int parent, lchild, rchild; //指向双亲、孩子结点的指针}HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树typedef char * * HuffmanCode; //动态分配数组存储哈夫曼编码表2.系统主要子程序详细设计哈夫曼编码模块设计分两步:首先构造哈夫曼树,然后完成哈夫曼编码。

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){//w存放n个字符的权值(均>0),构造哈夫曼树HT并求出n个字符的哈夫曼编码HC int i,j,m,s1,s2,start;char *cd;unsigned int c,f;if (n<=1) return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); //0号单元未用for (i=1;i<=n;i++) //叶子结点初始化并放入1-n号单元{HT[i].weight=w[i];HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for (i=n+1; i<=m;i++) //非叶子结点初始化{HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}printf("\n哈夫曼树的构造过程如下所示:\n");printf("HT初态:\n 结点weight parent lchild rchild");for (i=1;i<=m;i++) //完成构造哈夫曼树算法的第1个步骤printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,HT[i].parent,HT[i].lchild, HT[i].rchild);printf(" 按任意键,继续...");getch();//创建哈夫曼树HTfor (i=n+1;i<=m;i++){Select (HT,i-1,&s1,&s2);//在HT[1..i-1]中选择parent为0且weight最小的两个结点HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;//将选取根结点权值最小的树作为左右子树HT[i].weight=HT[s1].weight+HT[s2].weight;//置新二叉树的根结点权值为其左、右子树根结点之和printf("\nselect:s1=%d s2=%d\n",s1,s2);//根结点权值最小的树在HT中的位置printf(" 结点weight parent lchild rchild");for (j=1;j<=i;j++)//输出选取根结点权值最小树的过程printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight,HT[j].parent,HT[j].lchild,HT[j].rchild);printf(" 按任意键,继续...");getch();}printf("\n%d个字符的哈夫曼编码如下:\n",n);//从叶子到根逆向求每个字符的哈夫曼编码HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个编码的头指针cd = (char * )malloc(n*sizeof(char)); //分配求编码的工作空间cd[n-1] = '\0'; //编码结束符for (i=1;i<=n;i++) //逐个字符求哈夫曼编码{start =n-1; //编码结束符位置for (c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//叶子结点到根逆向求编码if (HT[f].lchild==c) cd[--start] ='0';else cd[--start] = '1';HC[i] = (char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间strcpy(HC[i], &cd[start]); //从cd复制编码(串)到HC }free(cd); //释放工作空间for(i=1;i<=n;i++)printf("<%2d>编码:%s\n",HT[i].weight,HC[i]);}//HuffmanCoding五、测试分析根据设计要求中的问题描述分别输入字符的个数和对应的权值,程序运行得到图4的开始界面。

图4哈夫曼编码程序开始界面构造哈夫曼树的过程如图(5~ 12)所示。

图5图6图7图8图9图10图11图12构造哈夫曼编码如图13所示。

图13 哈夫曼编码六、用户手册(1)本程序执行文件为“哈夫曼树的建立及其应用.exe”。

(2)进入本程序之后,分别输入哈夫曼编码字符的个数和对应的权值。

(3)随即显示哈夫曼树的构造过程,最终显示出对应权值的哈夫曼编码。

七、调试报告此次课程设计主要是了解哈夫曼树的设计,并学会哈夫曼编码的设计。

通过这次课程设计,我学到了课本上以外的许多知识,学会了树相关的基础知识,受益匪浅。

《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

其次是,根据实际问题的需要,对各个方面的优缺点加以综合平衡,从中选择比较适宜的实现方法。

比如在选择数据结构的时候,就要求从时间性能和空间性能去考虑,从而使得能编写出更加实用和高效的代码,而要做到这点,就要求对知识点很熟悉。

在这次课程设计中曾遇到了不少问题,比如输入整型变量的时候,没有办法限制其不能输入字符型,还有类型必须前后匹配等等。

使我明白了理论与实际相结合的重要性,使我更深刻地意识到:掌握了好的理论并不一定能马上将其运用到自己的程序中,而只有通过不断地学习和实践,不断地运用它,才能熟能生巧!八、程序清单#include <stdio.h>#include <malloc.h>#include <string.h>#include <conio.h>typedef struct{unsigned int weight; //用来存放各个结点的权值unsigned int parent,lchild,rchild; //指向双亲、孩子结点的指针}HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树typedef char * * HuffmanCode; //动态分配数组存储哈夫曼编码表//1.选择权值最小的两个结点void Select(HuffmanTree &HT,int m,int *s1,int *s2){int i,min;for(i=1;i<=m;i++) //在HT[1..i-1]中选择parent为0且weight最小的两个结点{if(HT[i].parent==0){min = i;i=m+1;}}for(i=1;i<=m;i++) //parent为0且weight最小的两个结点,第一个序号为s1 {if(HT[i].parent == 0){if(HT[i].weight < HT[min].weight)min = i;}}*s1 = min;for(i=1; i<=m;i++) //在HT[1..i-1]中选择parent为0且weight最小的两个结点{if(HT[i].parent == 0 &&i!=(*s1)){min = i;i = m+1;}}for(i=1;i<=m;i++) //parent为0且weight最小的两个结点,第二个序号为s2 {if(HT[i].parent == 0 &&i!=(*s1)){if(HT[i].weight < HT[min].weight)min = i;}}*s2 = min;}//Select//2.构造哈夫曼编码void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){//w存放n个字符的权值(均>0),构造哈夫曼树HT并求出n个字符的哈夫曼编码HC int i,j,m,s1,s2,start;char *cd;unsigned int c,f;if (n<=1) return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); //0号单元未用for (i=1;i<=n;i++) //叶子结点初始化并放入1-n号单元{HT[i].weight=w[i];HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for (i=n+1; i<=m;i++) //非叶子结点初始化{HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}printf("\n哈夫曼树的构造过程如下所示:\n");printf("HT初态:\n 结点weight parent lchild rchild");for (i=1;i<=m;i++) //完成构造哈夫曼树算法的第1个步骤printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);printf(" 按任意键,继续...");getch();//创建哈夫曼树HTfor (i=n+1;i<=m;i++){Select (HT,i-1,&s1,&s2);//在HT[1..i-1]中选择parent为0且weight最小的两个结点HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;//将选取根结点权值最小的树作为左右子树HT[i].weight=HT[s1].weight+HT[s2].weight;//置新二叉树的根结点权值为其左、右子树根结点之和printf("\nselect:s1=%d s2=%d\n",s1,s2);//根结点权值最小的树在HT中的位置printf(" 结点weight parent lchild rchild");for (j=1;j<=i;j++)//输出选取根结点权值最小树的过程printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight,HT[j].parent,HT [j].lchild,HT[j].rchild);printf(" 按任意键,继续...");getch();}printf("\n%d个字符的哈夫曼编码如下:\n",n);//从叶子到根逆向求每个字符的哈夫曼编码HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个编码的头指针cd = (char * )malloc(n*sizeof(char)); //分配求编码的工作空间cd[n-1] = '\0'; //编码结束符for (i=1;i<=n;i++) //逐个字符求哈夫曼编码{start =n-1; //编码结束符位置for (c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//叶子结点到根逆向求编码if (HT[f].lchild==c) cd[--start] ='0';else cd[--start] = '1';HC[i] = (char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间strcpy(HC[i], &cd[start]); //从cd复制编码(串)到HC }free(cd); //释放工作空间for(i=1;i<=n;i++)printf("<%2d>编码:%s\n",HT[i].weight,HC[i]);}//HuffmanCoding//3.主函数void main(){HuffmanTree myHuffmanTree;HuffmanCode myHuffmanCode;int *w,i;int n, wei; //编码个数及权值printf("请输入需要哈夫曼编码的字符个数:");scanf("%d",&n);w=(int *)malloc((n+1) *sizeof(int));for(i=1;i<=n;i++){printf("请输入第%d字符的权值:",i);fflush(stdin);scanf("%d",&wei);w[i]=wei;}HuffmanCoding(myHuffmanTree,myHuffmanCode,w,n);}设计题目<二>: 3.4.6括号匹配的检验一、设计要求1.问题描述假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])]等为正确格式,[( ])或((( ]均为不正确的格式。

相关文档
最新文档