数据结构课程设计-图的遍历和生成树的求解实现说明书

合集下载

数据结构中的树与图算法教程

数据结构中的树与图算法教程

数据结构中的树与图算法教程第一章树的基本概念与遍历算法树是一种非线性数据结构,它由若干个节点组成,这些节点以层级的方式连接,形成分支的结构。

树中的一个节点被称为根节点,它没有父节点;其他节点可以有一个或多个父节点,这些节点被称为子节点。

树具有分支,但没有循环。

1.1 具体树的概念在树的结构中,每个节点可以有零个或者多个子节点,但是只能有一个父节点。

树具有层级关系,通过连接节点的边表示。

1.2 树的分类常见的树包括二叉树、二叉搜索树、红黑树等。

其中,二叉树是一种特殊的树结构,它的每个节点最多可以有两个子节点。

1.3 树的遍历算法树的遍历算法主要有前序遍历、中序遍历和后序遍历。

前序遍历是以根节点、左子树、右子树的顺序进行遍历;中序遍历是以左子树、根节点、右子树的顺序进行遍历;后序遍历是以左子树、右子树、根节点的顺序进行遍历。

第二章树的存储结构与常见应用2.1 树的存储结构树的存储结构有两种常见的实现方式,分别是链表实现和数组实现。

链表实现利用指针进行节点的连接,数组实现则使用数组的索引来表示节点之间的关系。

2.2 平衡二叉树平衡二叉树是一种自平衡的二叉搜索树,它的左右子树的高度差不超过1。

平衡二叉树的插入和删除操作都可以通过旋转操作进行平衡。

2.3 哈夫曼树哈夫曼树是一种特殊的二叉树,用于编码和解码数据。

哈夫曼树中出现频率高的字符距离根节点较近,而出现频率低的字符距离根节点较远,以实现编码的高效率。

第三章图的基本概念与遍历算法3.1 图的基本概念图是由节点和边组成的非线性数据结构。

节点表示实体,边表示节点之间的关系。

图可以分为有向图和无向图两种类型,有向图的边是有方向的,无向图的边没有方向。

3.2 图的存储结构图的存储结构有邻接矩阵和邻接表两种常见的方式。

邻接矩阵是一个二维数组,用于表示节点之间的连接关系;邻接表是由链表或者数组实现的,用于表示每个节点相邻节点的信息。

3.3 图的遍历算法图的遍历算法主要有深度优先搜索(DFS)和广度优先搜索(BFS)。

数据结构实验报告图的遍历讲解

数据结构实验报告图的遍历讲解

数据结构实验报告图的遍历讲解一、引言在数据结构实验中,图的遍历是一个重要的主题。

图是由顶点集合和边集合组成的一种数据结构,常用于描述网络、社交关系等复杂关系。

图的遍历是指按照一定的规则,挨次访问图中的所有顶点,以及与之相关联的边的过程。

本文将详细讲解图的遍历算法及其应用。

二、图的遍历算法1. 深度优先搜索(DFS)深度优先搜索是一种常用的图遍历算法,其基本思想是从一个顶点出发,沿着一条路径向来向下访问,直到无法继续为止,然后回溯到前一个顶点,再选择此外一条路径继续访问。

具体步骤如下:(1)选择一个起始顶点v,将其标记为已访问。

(2)从v出发,选择一个未被访问的邻接顶点w,将w标记为已访问,并将w入栈。

(3)如果不存在未被访问的邻接顶点,则出栈一个顶点,继续访问其它未被访问的邻接顶点。

(4)重复步骤(2)和(3),直到栈为空。

2. 广度优先搜索(BFS)广度优先搜索是另一种常用的图遍历算法,其基本思想是从一个顶点出发,挨次访问其所有邻接顶点,然后再挨次访问邻接顶点的邻接顶点,以此类推,直到访问完所有顶点。

具体步骤如下:(1)选择一个起始顶点v,将其标记为已访问,并将v入队。

(2)从队首取出一个顶点w,访问w的所有未被访问的邻接顶点,并将这些顶点标记为已访问,并将它们入队。

(3)重复步骤(2),直到队列为空。

三、图的遍历应用图的遍历算法在实际应用中有广泛的应用,下面介绍两个典型的应用场景。

1. 连通分量连通分量是指图中的一个子图,其中的任意两个顶点都是连通的,即存在一条路径可以从一个顶点到达另一个顶点。

图的遍历算法可以用来求解连通分量的个数及其具体的顶点集合。

具体步骤如下:(1)对图中的每一个顶点进行遍历,如果该顶点未被访问,则从该顶点开始进行深度优先搜索或者广度优先搜索,将访问到的顶点标记为已访问。

(2)重复步骤(1),直到所有顶点都被访问。

2. 最短路径最短路径是指图中两个顶点之间的最短路径,可以用图的遍历算法来求解。

图的遍历和生成树求解说明书Word版

图的遍历和生成树求解说明书Word版

*******************实践教学*******************兰州理工大学计算机与通信学院2012年春季学期算法与数据结构课程设计题目:______________专业班级:_______________姓名:_______________学号:指导教师:李睿成绩:_______________目录摘要 (2)1.采用类C语言定义相关数据类型 (2)2.各模块流程图及伪码算法 (3)3.函数的调用关系图 (10)4.调试分析 (11)5.测试结果 (12)6.源程序(见附录) (18)设计总结 (19)参考文献 (20)致谢 (20)附件Ⅰ任务一源程序代码 (21)摘要很多涉及图上操作的算法都是以图的遍历操作为基础的,该设计要求写一个程序,演示出图遍历的过程,并给出图的生成树(网的最小代价生成树)。

通过该题目的设计过程,可以加深理解图数据结构及队列的逻辑结构、存储结构及图的深度优先和广度优先遍历过程,掌握图数据据结构上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养动手能力。

关键字:图;深度优先遍历;广度优先遍历;生成树1.采用类C语言定义相关数据类型图存储结构的定义:1)顺序存储(邻接矩阵)#define MAX_VERTEX_NUM 30 //最大顶点个数Typedef enum{DG,DN,UDG,UDN} GraphKind; //图的种类:有向图、有向网、无向图、无向网ArcTypeAdjMtrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //ArcType 是顶点关系类型,对无权图,用0和1表示是否相邻,对于网,则为权值类型typedef struct {VertexType vex[MAX_VERTEX_NUM]; //顶点数组AdjMtrix arc; //邻接矩阵int vexnum,arcnum; //图中的顶点数和边数GraphKind kind; //图的种类}GraphMtrix;(2)邻接表的存储#define MAX_VERTEX_NUM 30 //最大顶点个数typedef struct EdgeNode{ //表结点int adjvex; //边或弧依赖的顶点序号InfType *info; //弧或边的相关信息,在网中则为权值struct EdgeNode *next;}EdgeNode;typedef struct VexNode{ //顶点元素VertexType vextex;EdgeNode *link;}VexNode,AdjList[MAX_VERTEX_NUM];typedef struct{ //邻接表AdjList vertices;int vexnum,arcnum; //图中的顶点数和边数GraphKind kind; //图的种类} AdjListGrap2.各模块流程图及伪码算法(1) 遍历算法a.深度优先遍历void DFS(AdjListGraph G,int v)//图G采用邻接表存储结构,v是遍历起始点在邻接表中的下标值,其下标从0开始{visited[v]=1; //置已访问标志visite(G.vertices[v].vextex); //访问顶点for (p = G.vertices[v].link; p; p = p->next)if (!visited[p->adjvex])DFS(G,p->adjvex);//当前顶点未访问,继续深度优先遍历} // DFSb.广度优先遍历void BFS(AdjListGrap G,intv)//图G采用邻接表存储结构,v是遍历起始点在邻接表中的下标,邻接表中下标从0开始,以队列作为基本辅助数据结构{InitQueue(Q); //初始化队列Qvisited[v]=1; //置已访问标志visite(G.vertices[v]. vextex); //访问顶点EnQueue(Q,v); //被访问顶点入队while (!QueueEmpty(Q)){DeQueue(Q,v); //出队列for (p = G.vertices[v].link; p; p = p->next) //找所有和v相邻接的顶点if (!visited[p->adjvex]){visited[p->adjvex]=1;visite(G.vertices [p->adjvex].vextex);EnQueue(Q,p->adjvex);} //if} //while} // BFS(2)流程图a.深度优先遍历dfstrab.广度优先遍历Bfstrac.Prim算法(3) 程序的伪代码算法:a.广度优先遍历:void dfstra (MGraph *G,int i){ /*以vi为出发点对邻接矩阵表示的图G进行DFS搜索,设邻接矩阵是0,l矩阵*/整型 j;打印 ("visit vertex:%c",G->vexs[i]);/*访问顶点vi*/ visited[i]=TRUE;for(j=0;j<G->n;j++) /*依次搜索vi的邻接点*/if(G->edges[i][j]==1&&!visited[j])DFSM(G,j)/*(vi ,vj)∈E,且vj未访问过,故vj为新出发点}DFSM*/说明:对于具有n个顶点和e条边的无向图或有向图,遍历算法DFSTraverse对图中每顶点至多调用一次DFS或DFSM。

图的遍历及生成树

图的遍历及生成树

• •邻接表的DFS算法
void DFS(ALGraph G, int v) { ArcNode *p;
visited[v] = 1; /*置已访问标记*/ printf("%d ", v); /*输出被访问顶点的编号*/ p = G.vertices[v].firstarc; /*p指向顶点v的第一个邻接点*/ while (p!=NULL) {
•v11
•v1,
•v2
•v3
•v2,
•v4,
•v5
•v8,
•v4
•v6
•v7
•v5,
•v3,
•v8
•v6,
•v7

•图的DFS算法一般描述
•int visited[MAXVEX]; //访问标志数组
•void DFSTraverse(Graph G)
•{ //对图G作深度优先遍历
• for( v=0; v<G.vexnum; ++v ) visited[v]=FALSE;
•} // DFS1
•G.arcs[v][j] =1
•有邻接点
•visited [n]=0
•未访问过

分析:
在遍历图时,对图中每个顶点至多调用一次DFS函数 ,因为一旦某个顶点被标志成已被访问,就不再从它出发 进行搜索。
因此,遍历图的过程实质上是对每个顶点查找其邻接 点的过程。其耗费的时间则取决于所采用的存储结构。 如果用邻接矩阵来表示图,遍历图中每一个顶点都要从 头扫描该顶点所在行,因此遍历全部顶点所需的时间为 O(n2)。 如果用邻接表来表示图,虽然有 2e 个表结点,但只需扫 描 e 个结点即可完成遍历,加上访问 n个头结点的时间, 因此遍历图的时间复杂度为O(n+e)。

数据结构课程设计说明书-排序二叉树的建立及遍历的实现

数据结构课程设计说明书-排序二叉树的建立及遍历的实现

课程设计任务书学生姓名: XXX 专业班级:计算机0502指导教师: XXX 工作单位:计算机科学与技术学院题目: 二叉排序树的建立及遍历的实现初始条件:理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)建立二叉排序树;(2)中序遍历二叉排序树并输出排序结果;2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字;(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等;(4)结束语;(5)参考文献。

时间安排:2007年7月2日-7日(第18周)7月2日查阅资料7月3日系统设计,数据结构设计,算法设计7月4日-5日编程并上机调试7月6日撰写报告7月7日验收程序,提交设计报告书。

指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日排序二叉树的建立及其遍历的实现摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据组合成排序二叉树,并进行,先序,中序和后序遍历。

设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。

关键字:排序二叉树,先序遍历,中序遍历,后序遍历0.引言我所设计的题目为排序二叉树的建立及其遍历的实现。

排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。

对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。

该设计根据输入的数据进行建立排序二叉树。

数据结构课程设计python

数据结构课程设计python

数据结构课程设计python一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用数据结构如列表、元组、字典和集合的特点及应用场景。

2. 学习并掌握栈和队列的操作原理及其在Python中的实现方法。

3. 掌握树和图的基本概念,了解二叉树、遍历算法及图的表示方法。

技能目标:1. 能够运用Python语言实现基本数据结构,并对其进行增、删、改、查等操作。

2. 能够利用栈和队列解决实际问题,如递归、函数调用栈、任务调度等。

3. 能够运用树和图解决实际问题,如查找算法、路径规划等。

情感态度价值观目标:1. 培养学生严谨的逻辑思维,提高分析问题和解决问题的能力。

2. 激发学生对数据结构和算法的兴趣,培养良好的编程习惯。

3. 引导学生认识到数据结构在实际应用中的重要性,增强学习热情和责任感。

课程性质:本课程为高年级数据结构课程,旨在使学生掌握Python语言实现数据结构的方法,提高编程能力和解决问题的能力。

学生特点:学生具备一定的Python编程基础,具有较强的逻辑思维能力,对数据结构有一定的了解。

教学要求:结合实际案例,采用任务驱动法,引导学生通过实践掌握数据结构的基本原理和应用方法。

注重培养学生的动手能力和团队协作精神,提高学生的综合素质。

通过本课程的学习,使学生能够具备独立设计和实现小型项目的能力。

二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,结合Python语言特点,分析各类数据结构在实际应用中的优势。

- 列表、元组、字典和集合的原理与应用- 栈与队列的操作原理及实现2. 线性表:讲解线性表的概念,重点掌握顺序表和链表的操作方法。

- 顺序表和链表的实现及操作- 线性表的查找和排序算法3. 树与二叉树:介绍树的基本概念,重点讲解二叉树的结构及其遍历算法。

- 树的基本概念和表示方法- 二叉树的性质、存储结构、遍历方法4. 图:讲解图的基本概念,掌握图的存储结构及遍历方法。

- 图的基本概念和表示方法- 图的遍历算法(深度优先搜索、广度优先搜索)- 最短路径和最小生成树算法5. 算法分析与设计:结合实例,分析算法性能,掌握基本的算法设计方法。

图的遍历和生成树求解实现的课程结构设计

图的遍历和生成树求解实现的课程结构设计

图是一种较线性表和树更为复杂的数据结构。

在线性表中,数据元素之间仅有线性关系,每一个数据元素惟独一个直接前驱和一个直接后继;在树形结构中, 数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素〔及其孩子结点相关但只能和上一层中一个元素〔即双亲结点相关;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,惟独强连通图才有生成树。

1> 先任意创建一个图;2> 图的 DFS,BFS 的递归和非递归算法的实现3> 最小生成树〔两个算法的实现,求连通分量的实现4> 要求用邻接矩阵、邻接表等多种结构存储实现输入数据类型为整型和字符型,输出为整型和字符a.图的邻接矩阵存储:根据所建无向图的结点数 n,建立n*n 的矩阵,其中元素全是无穷大〔int_max,再将边的信息存到数组中。

其中无权图的边用 1 表示, 无边用 0 表示;有全图的边为权值表示,无边用∞表示。

b.图的邻接表存储:将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。

c.图的广度优先遍历:假设从图中的某个顶点 v 出发,在访问了 v 之后挨次访问 v 的各个未曾经访问过的邻接点,然后再访问此邻接点的未被访问的邻接点, 并使"先被访问的顶点的邻接点"先于"后被访问的顶点的邻接点"被访问,直至图中所有已被访问的顶点的邻接点都被访问到。

若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。

d.图的深度优先遍历:假设从图中某顶点 v 出发,依挨次访问 v 的邻接顶点, 然后再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问, 这是个递归的过程。

e.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索, 而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。

图的遍历及生成树.ppt

图的遍历及生成树.ppt
• 首先访问出发顶点v0 • 选择一个与v0相邻接的且末访问过的顶点w访问 • 再从w开始,按深度优先搜索…..
• 每当到达一个其所相邻接的顶点都已被访问过的 顶点,则从最后所访问的顶点开始,依次退回到尚 有邻接顶点末曾访问过的顶点u,并从u开始进行 深序优先搜索…..
• 直到所有顶点都访问过或从任何一个已访问过的 顶点出发,再也无法到达末曾访问过的顶点
int ver2;} E_NODE; L_NODE *head[MAXN]; int visit[MAXN]; E_NODE e[MAXN]; int n,m,u;
void creat_adj_list(head,n,e,m) L_NODE *head[ ]; E_NODE e[ ]; int n,m; {int i,u,v; L_NODE *p; for (i=1;i<=n;i++) head[i]=NULL; for(i=0;i<m;i++) { u=e[i].ver1; v=e[i]=ver2; p=(L_NODE*)moalloc(sizeof(L_NODE)); p->ver=v; p->link=head[u];head[u]=p; p=(L_NODE*)moalloc(sizeof(L_NODE)); p->ver=u; p->link=head[v];head[v]=p;} }
}
求图的连通分量
• 对图的每一个顶点进行检验
– 若被访问过,则该顶点落在已被求出的连通分 量上
– 若末被访问过,则从该顶点出发遍历图,便可 求得图的另一个连通分量
生成树和最小生成树
• 生成树:
设G是一个连通无向图,若G’是包含G中所有 顶点的一个无回路的连通子图,则称G’是G的一棵 生成树
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*******************实践教学*******************兰州理工大学计算机与通信学院2012年春季学期算法与数据结构课程设计题目:图的遍历和生成树的求解实现专业班级:计算机科学与技术姓名:***学号:1234567指导教师:****成绩:目录摘要 (3)前言 (4)正文 (5)1.问题描述: (5)2.采用类C语言定义相关的数据类型 (5)3.各模块流程图及伪码算法 (6)4.函数的调用关系图 (8)5.调试分析 (9)1.调试中遇到的问题及对问题的解决方法 (9)2.算法的时间复杂度和空间复杂度 (9)6.测试结果 (10)参考文献 (14)图是一种复杂的非线性数据结构,一个图G(Grah)由两个集合V和E构成,图存在两种遍历方式,深度优先遍历和广度优先遍历,广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的顶点的领接点先于后访问的顶点被访问。

直至所有领接点被访问到。

深度优先的基本思路是从某个顶点出发,访问此顶点,然后依次从V的未被访问的领接点出发深度优先检索土。

直至图中所有顶点都被访问到。

PRIM算法—KRUSKAL算法;可以对图形进行最小生成树的求解。

主要问题是:(1)当给出一个表达式时,如何创建图所表达的树,即相应的逻辑结构和存储结构?(2)表达式建立好以后,如何求出其遍历?深度优先和广度优先遍历。

(3)计算它的最小生成树?主要是prim算法和kruscal算法两种形式。

很多涉及图的操作的算法都是以图的遍历操作为基础,通过遍历的演示,方便在学习中更好的理解突地遍历的过程。

通过对图的深度优先遍历和广度优先遍历的演示,分别两种遍历的不同与其优缺点。

我们在对一些问题进行求解时,会发现有些问题很难找到规律,或者根本无规律可寻。

对于这样的问题,可以利用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再根据题目条件从所有可能的情况中,删除那些不符合条件的解。

在深度优先搜索算法中,是深度越大的结点越先得到扩展。

如果在搜索中把算法改为按结点的层次进行搜索,本层的结点没有搜索处理完时,不能对下层结点进行处理,即深度越小的结点越先得到扩展,也就是说先产生的结点先得以扩展处理,这种搜索算法称为广度优先搜索法。

很多问题都可以用广度优先搜索进行处理,如翻币问题、最短路径问题等。

在计算机中,有多种方法存储图的信息,由于图的结构复杂,使用广泛,一般应根据实际的应用,选择适合的表示方法。

常用的图的存储结构有邻接矩阵、邻接多重表和邻接表。

在实际问题当中,经常遇到这类问题,为新建的某个机构进行选址,道路交通路线,如何走完所有路线,旅游线路等一系列问题都涉及到图的知识。

图是一种复杂的非线性数据结构,一个图G(Grah)由两个集合V和E。

构成,图存在两种遍历方式,深度优先遍历和广度优先遍历,广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的顶点的领接点先于后访问的顶点被访问。

直至所有领接点被访问到。

深度优先的基本思路是从某个顶点出发,访问此顶点,然后依次从V的未被访问的领接点出发深度优先检索图。

直至图中所有顶点都被访问到。

PRIM算法—KRUSKAL算法;可以对图形进行最小生成树的求解。

树型结构是一种非线性结构,它用于描述数据元素之间层次关系,如人类社会的族谱等,树型结构的应用非常广泛,磁盘文件目录结构就是一个典型的例子。

1.问题描述:图是一种复杂的非线性数据结构,一个图G(Grah)由两个集合V和E构成,图存在两种遍历方式,深度优先遍历和广度优先遍历,广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的顶点的领接点先于后访问的顶点被访问。

直至所有领接点被访问到。

深度优先的基本思路是从某个顶点出发,访问此顶点,然后依次从V的未被访问的领接点出发深度优先检索土。

直至图中所有顶点都被访问到。

PRIM算法—KRUSKAL算法;可以对图形进行最小生成树的求解。

2.采用类c语言定义相关的数据类型#define int_max 10000 //定义邻接矩阵最大值10000为无穷大#define max 20 //最大顶点个数typedef struct //开始对邻接表或图进行定义{char vexs[20]; //顶点数的名称AdjMatrix arcs; //邻接矩阵int vexnum,arcnum //图中顶点数和边数int creatMGraph_L(MGraph_L &G)//创建图用邻接矩阵表示int visited[max]; //访问标记typedef struct arcnode //弧结点int adjvex; //该弧指向的顶点的位置,即边或弧依赖的顶点序号char *info; // 该弧信息char data; //结点信息基本操作:int creatadj(algraph &gra,MGraph_L G)//用邻接表存储图int initqueue(linkqueue &q)//初始化队列int enqueue(linkqueue &q,int e)//入队int dequeue(linkqueue &q,int &e)//出队int queueempty(linkqueue q)//判断队为空void bfstra(algraph gra)//广度优先遍历int bfstra_fen(algraph gra)//求连通分量3.各模块流程图及伪码算法int prim(int g[][max],int n) //最小生成树PRIM算法{int lowcost[max],prevex[max]; //LOWCOST[]存储当前集合U分别到剩余结点的最短路径//prevex[]存储最短路径在U中的结点int i,j,k,min;for(i=2;i<=n;i++) //n个顶点,n-1条边{lowcost[i]=g[1][i]; //初始化prevex[i]=1; //顶点未加入到最小生成树中}lowcost[1]=0; //标志顶点1加入U集合for(i=2;i<=n;i++) //形成n-1条边的生成树{min=inf;k=0;for(j=2;j<=n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边if((lowcost[j]<min)&&(lowcost[j]!=0)){min=lowcost[j];k=j;}printf("(%d,%d)%d\t",prevex[k]-1,k-1,min);lowcost[k]=0; //顶点k加入Ufor(j=2;j<=n;j++) //修改由顶点k到其他顶点边的权值if(g[k][j]<lowcost[j]){lowcost[j]=g[k][j];prevex[j]=k;}printf("\n");}return 0;}int acrvisited[100];//kruscal弧标记数组int find(int acrvisited[],int f){while(acrvisited[f]>0)f=acrvisited[f];return f;}void kruscal_arc(MGraph_L G,algraph gra) {edg edgs[20];int i,j,k=0;for(i=0;i!=G.vexnum;++i)for(j=i;j!=G.vexnum;++j){if(G.arcs[i][j].adj!=10000){edgs[k].pre=i;edgs[k].bak=j;edgs[k].weight=G.arcs[i][j].adj;++k;}}int x,y,m,n;int buf,edf;for(i=0;i!=gra.arcnum;++i)acrvisited[i]=0;for(j=0;j!=G.arcnum;++j){m=10000;for(i=0;i!=G.arcnum;++i){if(edgs[i].weight<m){m=edgs[i].weight;x=edgs[i].pre;y=edgs[i].bak;n=i;}}// cout<<x<<y<<m;// cout<<endl;buf=find(acrvisited,x);edf=find(acrvisited,y);// cout<<buf<<" "<<edf<<endl;edgs[n].weight=10000;if(buf!=edf){acrvisited[buf]=edf;cout<<"("<<x<<","<<y<<")"<<m;cout<<endl;}}}4.函数的调用关系图函数调用关系如图4.1所示图4.1 函数调用关系图5.调试分析1.调试中遇到的问题及对问题的解决方法解决Visual C++ 6.0不正确连接的问题明明改动了一个文件,却要把整个项目全部重新编译链接一次。

刚刚链接好,一运行,又提示重新编译链接一次。

这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。

可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新“Rebuild All”一次。

2.算法的时间复杂度和空间复杂度关于时间复杂度的计算是按照运算次数来进行的, 关于空间复杂度的计算是在程序运行过程所要借助的内容空间大小。

即:空间复杂是储存空间的大小和变换等等决定的...时间复杂是逻辑比较、赋值等基本运算的次数决定的...prim算法的时间复杂度为O(n 2),kruskcal算法的时间复杂度为O(eloge)prim的空间复杂度为O(n* prevex), kruskcal算法的空间复杂度为O(n)6.测试结果(1)输入图的顶点即弧度个数:(2)分别写出边的权值:邻接矩阵和邻接表创建成功,显示出菜单:菜单选择:输入0,显示邻接矩阵输出y 进行下一步操作,重新选择菜单,输出1显示邻接表:输出y 进行下一步操作,重新选择菜单,输出2显示广度优先遍历:输出y 进行下一步操作,重新选择菜单,输出3显示深度优先遍历:输出y 进行下一步操作,重新选择菜单,输出4,显示prim算法计算最小生成树:输出y 进行下一步操作,重新选择菜单,输出5,显示kruscal算法计算最小生成树:输出y 进行下一步操作,重新选择菜单,输出6,计算出该图的连通分量:输出n,结束操作,退出运行:设计总结在这三周的算法与数据结构课程设计中,我的题目是:图的遍历和生成树的求解实现,这三周课程设计中,通过该题目的设计过程,我加深了对图数据结构及队列的逻辑结构,存储结构及图的深度优先和广度优先遍历过程,Prim算法和Kruscal算法进行最小生成树求解过程的理解,对图数据结构上基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

相关文档
最新文档