收藏 分享(赏)

图的遍历与最小生成树的实现.doc

上传人:11xg27ws 文档编号:9332868 上传时间:2019-08-02 格式:DOC 页数:27 大小:1.46MB
下载 相关 举报
图的遍历与最小生成树的实现.doc_第1页
第1页 / 共27页
图的遍历与最小生成树的实现.doc_第2页
第2页 / 共27页
图的遍历与最小生成树的实现.doc_第3页
第3页 / 共27页
图的遍历与最小生成树的实现.doc_第4页
第4页 / 共27页
图的遍历与最小生成树的实现.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、数学与计算机学院课程设计说明书课 程 名 称: 数据结构- 课程设计 课 程 代 码: 题 目: 图的遍历与最小生成树 年级/专业/班: 学 生 姓 名: 学 号: 开 始 时 间: 2011 年 06 月 14 日完 成 时 间: 2011 年 06 月 27 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5) 说明书撰写质量(45) 总 分(100)指导教师签名: 年 月 日摘 要 图是一种比线形表和树更为复杂的数据结构。在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。本程序是采用邻接矩阵、 邻接表、十字链表等多种结构存储来实现对图

2、的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。关键词:图;存储结构;遍历 2图的遍历与最小生成树目 录 1 需求分析 .31.1 任务与要求 31.2 程序的主要功能 31.2.1 邻接矩阵存储结构 .31.2.2 邻接链表存储结构 .41.2.3 十字链表存储结构 .42 开发及运行平台 .53 概要设计 .53.1 概要设计图 53.2 抽象数据的说明 .64 详细设计 .85 系统测试 .86 结论 15参考文献 16附 录 .173图的遍历与最小生成树1 需求分析1.1 任务与要求本程序设计的主要任务是为了

3、完成以下功能:1. 由键盘向程序输入相关数据;2. 程序处理输入数据,以十字链表,邻接矩阵和邻接链表的形式输出;3. 根据已建成的图,程序实现图的深度优先遍历;4. 程序输出图的广度优先遍历顺序;5. 显示图的最小生成树,连同分量的实现;6. 采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。测试数据:1.邻接矩阵测试数据:6 6 a b c d e f a b 2 a e 6 a d 5 b d 4 b c 1 b f 3 2.邻接链表测试数据:7 8 a b c d e f g a b a e a c a f b g b d d g c f3.十字链表测试数据:4 5 3 2

4、2 5 4 3 99 3 4 661.2 程序的主要功能1.2.1 邻接矩阵存储结构该模块主要可以实现用邻接矩阵建图,使用不同方法遍历改图,实现最小生成树以及非连同图的连通分量的求解4图的遍历与最小生成树如图:邻接矩阵存储结构邻接矩阵建图p r im最小生成树广度优先搜索深度优先搜索图 1.2.1 邻接矩阵存储结构1.2.2 邻接链表存储结构该模块主要实现:用邻接链表建图,使用不同方法遍历图,如下:邻接链表存储结构创建图深度优先搜索广度优先搜索图 1.2.2 邻接链表存储结构1.2.3 十字链表存储结构5图的遍历与最小生成树该模块主要可以实现:创建十字链表,十字链表的显示,查找元素,如图:十字

5、链表存储结构新建十字链表查找元素显示十字链表图 1.2.3 十字链表存储结构2 开发及运行平台开发平台:Microsoft visual studio 2008运行平台:Windows ;3 概要设计3.1 概要设计图根据本系统对功能实现的要求,主要可以分为一下三个大的模块:1.邻接矩阵存储结构;2.邻接链表存储结构;3.十字链表存储结构;其中每个模块又包涵其它相应的子功能模块。6图的遍历与最小生成树则根据以上可以得到本系统的概要设计图如下图示:图的遍历与最小生成树邻接矩阵存储结构退出系统十字链表存储结构邻接链表存储结构图 3.1 概要设计图3.2 抽象数据的说明本程序中相关抽象数据定义如下:

6、#ifndef COMMON_H#define COMMON_H#includeusing namespace std;const int MAX = 10; /最大结点数bool visitedMAX; /访问数组/-邻接链表-typedef struct ArcNode int adjvex;ArcNode *next;ArcNode;typedef struct char data;ArcNode *firstarc;AdjListMAX;typedef struct AdjList vertices;7图的遍历与最小生成树int vexnum, arcnum;ALGraph;/-邻接矩

7、阵-typedef struct char verticesMAX; /结点向量int arcsMAXMAX; /邻接矩阵int vexnum, arcnum; /结点数和弧数MGraph;struct char adjvex;int lowcost;closedgeMAX;/-十字链表-struct linknode int rows,cols;linknode *down,*right;union vnext int v;linknode *next; node; ;linknode *CreateMatlind(); linknode *InputMatlind(linknode,int

8、);void ShowMatlind(linknode);void SearchMatlind(linknode *hm,int s);#endif8图的遍历与最小生成树4 详细设计在以上工作的基础上,基本的设计已经完成。由此可以得出整个系统的层次图:图的遍历与最小生成树邻接矩阵存储结构十字链表存储结构邻接链表存储结构邻接矩阵建图创建图p r im最小生成树广度优先搜索深度优先搜索深度优先搜索广度优先搜索新建十字链表查找元素显示十字链表图 4.1 主要层次图9图的遍历与最小生成树5 系统测试登录系统主界面,如下图:图 5.1 系统主菜单选择功能 1,进入第二菜单界面:图 5.2 邻接矩阵存储结

9、构10图的遍历与最小生成树选择 1,建立矩阵图:图 5.3 邻接矩阵创建图邻接矩阵显示:图 5.4 矩阵显示图11图的遍历与最小生成树返回第二菜单,选择 2,深度优先搜索:图 5.5 深度优先搜索选择 3,广度优先搜索:图 5.6 广度优先 412图的遍历与最小生成树选择 4,最小生成树:图 5.7 最小生成树返回主菜单,选择 2,邻接链表存储结构的实现:图 5.8 邻接链表功能选择功能 1,如下:图 5.9 图信息录入13图的遍历与最小生成树显示:图 5.10 邻接链表形式显示选择 2,深度优先搜索:图 5.11 深度优先结果选择 3,广度优先搜索:图 5.12 广度优先结果14图的遍历与最

10、小生成树返回主菜单,选择功能 3:图 5.13 十字链表选择 1 建立十字链表后选择 2:图 5.14 显示十字链表15图的遍历与最小生成树选择 3,查找元素(比如为 66):图 5.15 元素查找16图的遍历与最小生成树6 结论通过本次课程设计,本人对图的的遍历以及最小生成树的认识有了更进一步理解,并且掌握了递归的使用;本程序在邻接矩阵、邻接链表以及十字链表三种不同存储结构下可以实现图的深度优先与广度优先的递归以及非递归的遍历,并且可以判断是否是连同图,当不是时可以自动显示其非连同图的连同分量。17图的遍历与最小生成树参考文献1冯博琴等著软件技术基础(修改版) 西安交通大学出版社,19972

11、严蔚敏等编著. 数据结构(C 语言版). 北京:清华大学出版社,20033李芸芳等编著.软件技术基础(第二版).北京:清华大学出版社,20004徐孝凯等著数据结构(C 语言描述) 北京:清华大学出版社,200418图的遍历与最小生成树附 录附录 1 源程序清单#include“AdjacencyList.h“#include“Matex.h“#include“OrList.h“/-主界面-int Menu() cout n;switch(n) case 0: exit(0); case 1: MetexManage(G); system(“pause“); system(“cls“); bre

12、ak;case 2: AdjacencyManage(); system(“pause“) system(“cls“); break;case 3: OrListManage(); system(“pause“); system(“cls“) break;default: cout #include#includeusing namespace std;#include“Common.h“linknode *CreateMatlind() / 创建空十字链表 int i,j,maxlin;linknode *hm,*cp100,*p;couti j;if (ij) maxlin=i;else

13、maxlin=j;hm=new linknode; cp0=hm;for (int l=1;lrows=0;p-cols=0;p-down=p;p-right=p;19图的遍历与最小生成树cpl=p;cpl-1-node.next=p; cpmaxlin-node.next=hm;hm=new linknode;hm-rows=i;hm-cols=j;return hm; linknode *InputMatlind(linknode *hm,int s) / 输入非零元素 linknode *cp100,*p,*q;int m,n,t;int i,j,k,maxlin;i=hm-rows;j

14、=hm-cols;if (ij) maxlin=i;else maxlin=j;cp0=hm;for (int l=1;lrows=0; p-cols=0; p-down=p; p-right=p; cpl=p;cpl-1-node.next=p; cpmaxlin-node.next=hm;for (int x=0;xmnt;p=new linknode; p-rows=m; p-cols=n; p-node.v=t; k=1; q=cpm;while (k) if (q-right=cpm) | (q-right-colsn) p-right=q-right; q-right=p; k=0

15、; else if(q-right-cols=n) p-right=q-right-right; q-right=p; k=0; else if(q-right-colsright; k=1; k=1; q=cpn; while (k) if (q-down=cpn) | (q-down-rowsm) p-down=q-down; q-down=p; k=0; else if (q-down-rows=m) p-down=q-down-down;q-down=p;k=0; else if (q-down-rowsdown;k=1; return hm;void ShowMatlind(link

16、node *hm) / 显示十字链表 int m,n;linknode *p,*q;m=hm-rows;n=hm-cols;q=p=hm-node.next;p=p-right;coutrows=i) else cout right=q) break;else if (p-right!=q) p=p-right;cout node.next; p=p-right;void SearchMatlind(linknode *hm,int s) / 查找元素 int m,n,k;linknode *p,*q;m=hm-rows;n=hm-cols;q=p=hm-node.next; p=p-righ

17、t;k=1;while(k) if (p-node.v)=s) coutrowscolsnode.vright!=q) p=p-right;else p=q; q=p=p-node.next;if (p=hm) coutright; void OrListManage() int s,k,ch=1; int choice;linknode *hm=NULL;system(“cls“);while (ch) coutchoice;switch(choice) case 1:hm=CreateMatlind(); / 调用创建空十字链表函数 do couts;if (s(hm-rows)*(hm-

18、cols) coutrows*hm-cols; k=1; 21图的遍历与最小生成树else k=0; while (k);hm=InputMatlind(hm,s); / 调用输入非零元素函数break; case 2:if (hm=NULL) couts;SearchMatlind(hm,s); / 调用查找非零元素函数 break; case 0: ch=0; return; if (choice=1 | choice=2 | choice=3) system(“pause“); system(“cls“); #include“Common.h“int queMAX;int front,

19、rear;/-查找结点位置-int LocateVex(MGraph iG.vexnum G.arcnum;for (i=0; iG.verticesi; cout c1 c2 value;s1 = LocateVex(G, c1);s2 = LocateVex(G, c2);G.arcss1s2 = G.arcss2s1 = value; cout =0; w=NextVex(G, v, w)if (!visitedw) MatexDFS(G, w);void MatexDepthFirstSearch(MGraph G) int i, v; int count = 0; front = r

20、ear = 0;for (v=0; v 1) cout =0; w=NextVex(G,u,w)if ( !visitedw ) visitedw = 1; cout closedgei.lowcost) min = closedgei.lowcost; k = i; return k;void MiniSpanTree_PRIM(MGraph int i, j; char u;for (i=0; iu;k = LocateVex(G, u);for (i=0; in; switch(n) case 0: system(“cls“); return;case 1: CreateMGraph(G

21、); system(“pause“); system(“cls“); break;case 2:MatexDepthFirstSearch(G);system(“pause“); system(“cls“); break;case 3: MatexBFSTraverse(G, 0); system(“pause“); system(“cls“); break;case 4: MiniSpanTree_PRIM(G); system(“pause“); system(“cls“); break;default: cout using namespace std;const int MAX = 1

22、0; /最大结点数 bool visitedMAX; /访问数组/-邻接链表-typedef struct ArcNode int adjvex; ArcNode *next; ArcNode;typedef struct char data; ArcNode *firstarc; AdjListMAX;typedef struct AdjList vertices; int vexnum, arcnum; ALGraph;/-邻接矩阵-typedef struct char verticesMAX; /结点向量int arcsMAXMAX; /邻接矩阵int vexnum, arcnum;

23、/结点数和弧数 MGraph;struct char adjvex; int lowcost; closedgeMAX;/-十字链表-struct linknode int rows,cols;linknode *down,*right;union vnext int v; linknode *next; node;linknode *CreateMatlind(); linknode *InputMatlind(linknode,int);void ShowMatlind(linknode);void SearchMatlind(linknode *hm,int s);#endif/-邻接链

24、表-#include“Common.h“/-根据节点名字查找位置 -int LocateVex(ALGraph iG.vexnum G.arcnum;cout G.verticesi.data;G.verticesi.firstarc = NULL; cout v1 v2;s1 = LocateVex(G, v1); s2 = LocateVex(G, v2); p1 = new ArcNode; /倒序建表p1-adjvex = s2; p1-next = G.verticess1.firstarc;G.verticess1.firstarc = p1; p2 = new ArcNode;

25、p2-adjvex = s1;p2-next = G.verticess2.firstarc; G.verticess2.firstarc = p2; cout adjvex next; cout adjvex )AdjacencyDFS(G, p-adjvex);p = p-next; void AdjacencyDFSManage(ALGraph ich;cout adjvex ) cout adjvex.data adjvex = 1;queuerear = p-adjvex;rear = (rear + 1) % MAX; p = p-next; cout n;switch(n) case 0: system(“cls“); return;case 1: AdjacencyCreatDG(G); system(“pause“); system(“cls“); break;case 2: AdjacencyDFSManage(G); system(“pause“); system(“cls“); break;case 3: AdjacencyBFS(G); system(“pause“); system(“cls“); break;default: cout “输入有误!n“ ; system(“pause“); system(“cls“);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报