数据结构课程设计报告

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构的课程设计

数据结构的课程设计

数据结构的课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点与应用场景。

2. 学会分析不同数据结构的存储方式和操作方法,并能运用到实际问题的解决中。

3. 掌握排序和查找算法的基本原理,了解其时间复杂度和空间复杂度。

技能目标:1. 能够运用所学数据结构知识,解决实际问题,提高编程能力。

2. 能够运用排序和查找算法,优化程序性能,提高解决问题的效率。

3. 能够运用数据结构知识,分析并解决复杂问题,培养逻辑思维能力和创新意识。

情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。

2. 增强学生的团队协作意识,培养合作解决问题的能力,提高沟通表达能力。

3. 培养学生的抽象思维能力,使其认识到数据结构在计算机科学中的重要性,激发对计算机科学的热爱。

本课程针对高中年级学生,结合学科特点和教学要求,注重理论与实践相结合,培养学生的编程能力和逻辑思维能力。

通过本课程的学习,使学生能够掌握数据结构的基本知识,提高解决实际问题的能力,同时培养良好的学习态度和价值观。

在教学过程中,将目标分解为具体的学习成果,以便进行后续的教学设计和评估。

二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构(线性表、栈、队列)和非线性结构(树、图)的特点。

2. 线性表:讲解线性表的顺序存储和链式存储结构,以及相关操作(插入、删除、查找等)。

3. 栈和队列:介绍栈和队列的应用场景、存储结构及相关操作。

4. 树和二叉树:讲解树的定义、性质、存储结构,二叉树的遍历算法及线索二叉树。

5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表)、图的遍历算法(深度优先搜索和广度优先搜索)。

6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理、实现及性能分析。

7. 查找算法:介绍线性查找、二分查找等查找算法的原理及实现。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验环境本次实验在以下环境下进行: - 操作系统: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. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。

2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。

3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。

本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。

课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。

二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。

主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。

2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。

3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。

4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。

5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。

《数据结构》课程设计报告

《数据结构》课程设计报告

《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。

本课程目标如下: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课时,学习排序和查找算法,掌握各类算法的实现和应用。

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

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

数据结构课程设计报告1、引言数据结构是计算机科学中的重要基础课程,它研究如何组织和管理数据以及数据之间的关系。

掌握良好的数据结构对于程序设计和算法的实现至关重要。

本报告将介绍在数据结构课程中完成的设计项目,主要包括设计目标、设计思路、实现细节以及结果分析等内容。

2、设计目标本设计项目的目标是实现一个简单的学生成绩管理系统,该系统能够实现对学生的基本信息以及各门课程成绩的管理和查询。

设计的关键要求如下:1.能够添加学生信息并关联其各门课程成绩;2.能够根据学号查询学生信息以及其各门课程成绩;3.能够计算学生的总成绩和平均成绩;4.能够实现对学生信息和成绩的修改和删除操作。

3、设计思路为了实现上述设计目标,我们采用了链表数据结构来保存学生信息和成绩。

链表的节点用来存储学生的基本信息,如学号、姓名、性别等,同时还包含一个指向课程成绩链表的指针。

课程成绩链表的节点用来存储每门课程的成绩。

在添加学生信息时,我们按照学号的顺序将学生节点插入到链表中。

通过遍历链表,我们可以根据学号查找到对应的学生节点,并进一步查找到该学生的课程成绩链表。

对于查询操作,我们可以通过遍历链表找到匹配的学生节点,然后输出其基本信息和课程成绩。

计算总成绩和平均成绩可以通过遍历课程成绩链表并累加每门课程的成绩来实现。

修改和删除操作可以通过遍历链表找到匹配的学生节点,并进行相应的修改或删除操作。

4、实现细节该学生成绩管理系统的具体实现细节如下:•使用C++编程语言实现;•采用链表数据结构,分别设计了学生信息链表和课程成绩链表;•学生信息链表的节点包括学号、姓名、性别等信息,以及指向课程成绩链表的指针;•课程成绩链表的节点包括课程名称和成绩信息;•提供了添加学生信息、添加课程成绩、查询学生信息、查询课程成绩、计算总成绩和平均成绩等功能;•通过遍历链表实现对学生信息和成绩的修改和删除操作。

5、结果分析经过测试和验证,该学生成绩管理系统能够满足设计目标,并能够正常运行。

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

数据结构课程设计报告院系:计算机学院班级:软件121班姓名:程猛学号:201200834122题目:最小生成树指导老师:杜献峰一、引言 (4)二、设计题目 (4)1.问题描述 (4)2.系统要求 (4)3.测试数据 (5)4.实现提示 (5)5.参考文献 (5)6.运行环境 (6)三、需求分析 (6)1.如何选择存储结构去建立一个带权网络。

(6)2.如何在所选存储结构下输出这个带权网络。

(6)3.如何实现PRIM算法和Kruskal算法的功能。

(6)4.如何从每个顶点开始找到所有的最小生成树的顶点。

(7)5.如何输出最小生成树的边及其权值。

(7)四、概要设计 (7)2.图的存储结构 (8)3.流程图 (8)五、详细设计 (9)1.主函数模块 (9)2.对路径权值进行排序 (10)六、调试与分析 (14)七、测试结果 (17)八、设计心得体会 (17)附录(源代码)18摘要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。

本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim 和Kruskal算法求最小生成树。

Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。

最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆, 构建造价最低的通讯网络。

一、引言本课程设计我们要解决的问题是图最小生成树问题。

要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。

本课程设计要解决的问题构造连通网的最小生成树 ,我们首先要做的是创建一个邻接矩阵,用以来存储图,然后我们要想好怎样利用普里姆算法和克鲁斯卡尔算法来构造最小生成树。

把这两种算法写入主函数,调试好程序。

最后写好报告。

二、设计题目1.问题描述若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。

如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。

2.系统要求利用克鲁斯卡尔算法求网的最小生成树。

利用普里姆算法求网的最小生成树。

要求输出各条边及它们的权值。

3.测试数据4.实现提示通信线路一旦建成,必然是双向的。

因此,构造最小生成树的网一定是无向图。

设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,100则表示没有路径。

5.参考文献[1] 严蔚敏. 数据结构(C语言版)[M]. 北京:清华大学出版社,1997.[2] 谭浩强. C程序设计(第三版)[M]. 北京:清华大学出版社,2005.1.[3] 二霍红卫算法设计与分析〔」西安西安电子科技大学出版社,2005.113-127.[4] 陈杰.计算机专业课程设计中的需求分析[J].集美大学学报,2009,10(2):89—92.[5] 高一凡. 数据结构算法实现及解析[M ]. 西安:西安电子科技大学出版社, 20026.运行环境VC++6.0三、需求分析1.如何选择存储结构去建立一个带权网络。

此问题的关键在于如何实现PRIM算法和Kruskal算法,实现的过程中如何得到构成最小生成树的所有顶点,此外输出也是一个关键问题所在,在此过程中经过了多次调试。

2.如何在所选存储结构下输出这个带权网络。

将图中的所有顶点存储到一个一维数组中,通过一个二维数组用邻接矩阵连实现对各边权值的存储3.如何实现PRIM算法和Kruskal算法的功能。

首先我们对prim算法的问题进行大致的概要分析:假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。

算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U 的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。

此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。

克鲁斯卡尔算法从另一种途径求网的最小生成树:假设连通网N=(V,{E}),则另最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。

在E中选择代价最小的边若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。

以此类推直至T中的所有顶点都在同一连通分量上为止。

4.如何从每个顶点开始找到所有的最小生成树的顶点。

对于prim算法从图的点集中任取一个顶点作为起始顶点,然后找到依附于该顶点的所有边选取权值最小的,依次找下去直至图中所有顶点都在一个点集中为止。

对于克鲁斯卡尔算法则通过对权值进行排序找出权值最小的顶点和边并把该边的顶点并入点集之中。

5.如何输出最小生成树的边及其权值。

通过访问数组来实现对最小生成树边和权值的输出。

四、概要设计1、设定图的抽象数据类型: ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为点集. 数据关系R: R={VR}VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径}基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合. 操作结果:按V和VR是定义构造图G.Sort(edge* ,MGraph *)初始条件: 图G存在,各边权值已知;操作结果:对权值进行排序;Find(int *, int )初始条件:前者为已存在的集合,后者为集合中的元素;操作结果:查找函数,确定后者所属子集;Swapn(edge *, int, int)初始条件: 图G存在,各边权值已知;操作结果:交换某两个边的权值;2.图的存储结构typedef struct{int vexnum,arcnum;}ALGraph;typedef struct //边的结构体定义{int begin,end; //边的开始和结束顶点int cost; //权值}EDGE;typedef struct{int edges[max][max];//int n,e;}MGraph;3.流程图五、详细设计在该函数中有6个模块,分别是主函数模块、路径权值进行排序、交换顶点及权值模块、判断是否回环、prim算法的实现、Kruskal算法的实现。

1.主函数模块ALGraph G;MGraph G2;int v,i,j;char a;do{system("cls");cout<<"\t***********************************\n\n";cout<<"\t 1 克鲁斯卡尔\n";cout<<"\t 2 普里姆\n";cout<<"\t 3 退出\n\n";cout<<"\t***********************************\n";cout<<"请输入序号:";cin>>a;switch(a){case '1': MiniSpanTree_Kruskal(G);system("pause");break;case '2': cout<<"请输入结点数:";cin>>G2.n;for(j=1;j<=G2.n;j++){cout<<"请输入第"<<j<<"个顶点所有边的权值(100代表不连通):";for(i=1;i<=G2.n;i++)cin>>G2.edges[j][i];}cout<<"请输入开始顶点:";cin>>v;MiniSpanTree_PRTM(G2,v);system("pause");break;default : break;}}while(a!='3');return 0;该模块包含菜单的设计以及通过一个switch语句来实现对prim算法和Kruskal算法的实现。

进入主菜单后选择相应的序号执行相应的操作,每进行一步后,按任意键继续进行下一个操作可重复执行。

2.对路径权值进行排序void Sort(EDGE *edges,ALGraph G)//对带权路径从小到大排序{int i,j;for(i=1;i<=G.arcnum;i++)for(j=i;j<=G.arcnum;j++)if(edges[i].cost>edges[j].cost)Swapn(edges,i,j);}在图中找到权值最小的边3.交换顶点及权值void Swapn(EDGE *edges,int i,int j)// 交换的两个顶点及权值{int temp;temp=edges[i].begin;edges[i].begin=edges[j].begin;edges[j].begin=temp;temp=edges[i].end;edges[i].end=edges[j].end;edges[j].end=temp;temp=edges[i].cost;edges[i].cost=edges[j].cost;edges[j].cost=temp;}该模块主要用于Kruskal算法,找到图中权值最小的一条边,然后交换它们的顶点和权值。

4.判断是否回环int Find(int *parents,int f)//判断是否形成环{while((parents[f])>0&&(f!=parents[f]))f=parents[f];return f;}在Kruskal算法中初始parents[]为0来设置访问未访问标志,以此来判断图是否成环。

5.prim算法的实现void MiniSpanTree_PRTM(MGraph &G,int v){int closedge[max];int lowcost[max];int i,j,k,min;for(i=1;i<=G.n;i++){lowcost[i]=G.edges[v][i];closedge[i]=v;}for(i=1;i<G.n;i++){min=INF;for(j=1;j<=G.n;j++)if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}printf("边(%d,%d)权为:%d\n",closedge[k],k,min);lowcost[k]=0;for(j=1;j<=G.n;j++)if(G.edges[k][j]!=0&&G.edges[k][j]<lowcost[j]){lowcost[j]=G.edges[k][j];closedge[j]=k;}}}6.Kruskal算法的实现void MiniSpanTree_Kruskal(ALGraph &G)//MiniSpanTree_Kruskal()函数实现{int i,s,v1,v2,value,bnf,edf;int parents[MAX_VERTEX_NUM];EDGE edges[MAX_VERTEX_NUM];cout<<endl<<"请输入顶点数: ";cin>>G.vexnum; //输入顶点数cout<<"请输入边数: ";cin>>G.arcnum; //输入边数cout<<"请输入(V1和V2), 例如: (V1=1,V2=3),(V1=2,V2=4)...";cout<<endl; //输入arc(v1,v2)for(i=1;i<=G.arcnum;++i){cout<<endl<<"请输入第"<<i<<"条边的第一个顶点: ";cin>>v1; //输入头顶点cout<<"请输入第"<<i<<"条边的第二个顶点: ";cin>>v2; //输入尾顶点cout<<"请输入第"<<i<<"条边的权值: ";cin>>value; //输入边的权值edges[i].begin=v1;edges[i].end=v2;while(v1<1||v1>G.vexnum||v2<1||v2>G.vexnum) //如果输入的非法,重新输入{cout<<"输入不合法,请重新输入!";cout<<endl<<"请输入第"<<i<<"条边的第一个顶点: ";cin>>v1;cout<<"请输入第"<<i<<"条边的第二个顶点: ";cin>>v2;cout<<"请输入第"<<i<<"条边的权值: ";cin>>value;edges[i].begin=v1;edges[i].end=v2;}edges[i].cost=value;}Sort(edges,G); //调用Sort()函数cout<<"按照排列好的序列逐个输出权值"<<endl;for(i=1;i<=G.arcnum;i++)cout<<edges[i].cost<<"\t";for(i=1;i<=G.vexnum;++i)parents[i]=0; //初始化array parents[]cout<<endl<<"最小生成树为:"<<endl;for(i=1,s=1;s<=G.vexnum&&i<=G.arcnum;i++){bnf=Find(parents,edges[i].begin);edf=Find(parents,edges[i].end);if(bnf!=edf){parents[bnf]=edf;cout<<endl<<edges[i].begin<<"-"; //输出最小生成树cout<<edges[i].end<<"的边为:";cout<<edges[i].cost;s++;}}}六、调试与分析测试数据如下图求该图的最小生成树1.进入主页面2.利用克鲁斯卡尔算法求最小生成树选择序号1使用克鲁斯卡尔算法求图的最小生成树。

相关文档
最新文档