课程设计 图的遍历
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、课程设计题目 图的遍历 二、课程设计内容 1.显示图的邻接矩阵, 图的邻接表, 深度优先遍历, 广度优 先遍历, 最小生成树PRIM算法, 最小生成树KRUSCAL算 法,图的连通分量。 2.当用户选择的功能错误时,系统会输出相应的提示。 3.通过图操作的实现,把一些实际生活中的具体的事物 抽象出来 三、进度安排 1.初步完成总体设计,搭好框架; 2.完成最低要求:两种必须都要实现,写出画图的思路; 3.进一步要求:画出图的结构,有兴趣的同学可以进一步改进图
typedef struct//-------------图的定义 { AdjList vertices; int vexnum,arcnum;//图的当前顶点数和狐数 int kind;//图的种类标志 }ALgraph; //^^^^^^^^^^^^^邻接矩阵存储^^^^^^^^^^^^^^^^^^^^ typedef enum { DG=1,DN,UDG,UDN} GraphKind; // 枚举——有向图, 有向网,无向图,无向网 typedef struct ArcCell{ int adj;//VRType 是顶点关系类型。对无权图有1和0 表示 //表示相邻否;对带权图,这为权值类型 InfoType * info;//该弧相关信息的指针 }ArcCell,AdjMatrix[INFINITY_VERTEX_NUM [INFINITY_VERTEX_NUM ]; typedef struct { char vexs[INFINITY_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph; typedef struct { int adjvex; int lowcost; }closedge; //^^^^^^^^^^^^^^^^^^^^^^^构建图^^^^^^^^^^^^^^^^^^^^^^^^^^ int Localvex(MGraph G,char v)//------在矩阵中查找顶点v的位置---{ int i=0;
的效果。
四、基本要求 1.界面友好,函数功能要划分好 2.程序要加必要的注释 3.要提供程序测试方案
#include "stdio.h" #include "iostream.h" #include "malloc.h" #include "stdlib.h" #define #define #define #define INFINITY_VERTEX_NUM 20 // 最大顶点个数 INFINITY 10000 // 无穷大 inf 9999 MAX 20 VRType ;
]
while(G.vexs[i]!=v) { ++i; } return i; } int CreateDG(MGraph &G)//---------------创建有向图 ------{ int i, j, k; char v1, v2; //int incInfo; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) ) { cout<<"\n\t输入错误!因为不满足n(n-1)的条件。\n"; return 0; } // cout<<"\t\t输入弧的信息(0表示忽略,1表示有信息):"; // cin>>incInfo; cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = 0; //图用0,网用INFINTY G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) {
cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点:\n"; cin>>v1>>v2; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = 1; //只要是无向就 是对称的,如果是有向就不 需要设置对称 // if ( incInfo != 0 ) // { // cout<<"\t\t输入弧的信息,以字符串的形式存储。\n"; // cin>>G.arcs[i][j].info; // } } cout<<"\t\t\t*******创建有向图成功!**********"<<endl; return 1; } int CreateDN( MGraph & G ) //------------构造有向网 { int i, j, k; char v1, v2; int w; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) ) { cout<<"\n\t*********输入错误!因为不满足n(n-1)的条 件。************\n"; return 0; } cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ )
typedef int
typedef char InfoType; typedef char VertexType; int visited[MAX];//访问标记 int we; //…………………………………………队列定义…………………… typedef struct qnode { int data; struct qnode *Next; }qnode,*queueptr; typedef struct { queueptr front; queueptr rear; }linkqueue; //……………………………………………………………………… typedef struct acr { int pre;//弧的一结点 int bak;//弧另一结点 int weight;//弧的权 }edg; //^^^^^^^^^^^^^^邻接表存储^^^^^^^^^^^^^^^ typedef struct ArcNode{ int adjvex; //该弧所指向顶点的位置 struct ArcNode * Nextarc; //指向下一条弧的指针 InfoType * info; // 该弧相关信息的指针 }ArcNode; typedef struct VNode{ VertexType data; //顶点信息 ArcNode * Firstarc; // 指向第一条依附该顶点的弧的指针 }VNode,AdjList[INFINITY_VERTEX_NUM];
{ for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = INFINITY; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点和边权值:"; cin>>v1>>v2>>w; cout<<endl; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = w; //只要是无向就 是对称的,如果是有向就不需 要设置对称 } cout<<"\n\t创建有向网成功!"<<endl; return 1; } int CreateUDG( MGraph & G ) // --------------创建无向图 { int i, j, k; char v1, v2; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexwenku.baidu.comum>>G.arcnum; cout<<endl; if (G.arcnum > G.vexnum * ( G.vexnum - 1 ) * 0.5f ) { cout<<"\n\t输入错误!因为不满足n(n-1)/2的条件。\n"; return 0; } cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ )
cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = INFINITY; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点和边权值:"; cin>>v1>>v2>>w; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = w; //只要是无向就 是对称的,如果是有向就不需 要设置对称 G.arcs[j][i].adj = w; G.arcs[i][j] = G.arcs[i][j]; } cout<<"\t创建无向网成功!"<<endl; return 1; } void CreateGraph(MGraph & G) //采用数组(邻接矩阵)表示法,构造G { int m,t; cout<<"\t\t你想构造哪种:"<<"\t\n\n\t\t 1DG------------------ 有向 图;\n\n\t\t 2DN------------------ 有向网;\n\n\t\t 3UDG------------------无 向图;\n\n\t\t 4UDN------------------无向网。\n\n\t\t请选择(输入 1,2,3,4):"; cin>>m; switch(m)
{ cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = 0; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点:"; cin>>v1>>v2; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = 1; G.arcs[j][i].adj = 1; } cout<<"\t创建无向图成功!"<<endl; return 1; } int CreateUDN( MGraph & G) // -----------------创建无向网 { int i, j, k; char v1, v2; int w; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) * 0.5f ) { cout<<"\n\t输入错误!因为不满足n(n-1)/2的条件。"; return 0; }
typedef struct//-------------图的定义 { AdjList vertices; int vexnum,arcnum;//图的当前顶点数和狐数 int kind;//图的种类标志 }ALgraph; //^^^^^^^^^^^^^邻接矩阵存储^^^^^^^^^^^^^^^^^^^^ typedef enum { DG=1,DN,UDG,UDN} GraphKind; // 枚举——有向图, 有向网,无向图,无向网 typedef struct ArcCell{ int adj;//VRType 是顶点关系类型。对无权图有1和0 表示 //表示相邻否;对带权图,这为权值类型 InfoType * info;//该弧相关信息的指针 }ArcCell,AdjMatrix[INFINITY_VERTEX_NUM [INFINITY_VERTEX_NUM ]; typedef struct { char vexs[INFINITY_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph; typedef struct { int adjvex; int lowcost; }closedge; //^^^^^^^^^^^^^^^^^^^^^^^构建图^^^^^^^^^^^^^^^^^^^^^^^^^^ int Localvex(MGraph G,char v)//------在矩阵中查找顶点v的位置---{ int i=0;
的效果。
四、基本要求 1.界面友好,函数功能要划分好 2.程序要加必要的注释 3.要提供程序测试方案
#include "stdio.h" #include "iostream.h" #include "malloc.h" #include "stdlib.h" #define #define #define #define INFINITY_VERTEX_NUM 20 // 最大顶点个数 INFINITY 10000 // 无穷大 inf 9999 MAX 20 VRType ;
]
while(G.vexs[i]!=v) { ++i; } return i; } int CreateDG(MGraph &G)//---------------创建有向图 ------{ int i, j, k; char v1, v2; //int incInfo; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) ) { cout<<"\n\t输入错误!因为不满足n(n-1)的条件。\n"; return 0; } // cout<<"\t\t输入弧的信息(0表示忽略,1表示有信息):"; // cin>>incInfo; cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = 0; //图用0,网用INFINTY G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) {
cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点:\n"; cin>>v1>>v2; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = 1; //只要是无向就 是对称的,如果是有向就不 需要设置对称 // if ( incInfo != 0 ) // { // cout<<"\t\t输入弧的信息,以字符串的形式存储。\n"; // cin>>G.arcs[i][j].info; // } } cout<<"\t\t\t*******创建有向图成功!**********"<<endl; return 1; } int CreateDN( MGraph & G ) //------------构造有向网 { int i, j, k; char v1, v2; int w; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) ) { cout<<"\n\t*********输入错误!因为不满足n(n-1)的条 件。************\n"; return 0; } cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ )
typedef int
typedef char InfoType; typedef char VertexType; int visited[MAX];//访问标记 int we; //…………………………………………队列定义…………………… typedef struct qnode { int data; struct qnode *Next; }qnode,*queueptr; typedef struct { queueptr front; queueptr rear; }linkqueue; //……………………………………………………………………… typedef struct acr { int pre;//弧的一结点 int bak;//弧另一结点 int weight;//弧的权 }edg; //^^^^^^^^^^^^^^邻接表存储^^^^^^^^^^^^^^^ typedef struct ArcNode{ int adjvex; //该弧所指向顶点的位置 struct ArcNode * Nextarc; //指向下一条弧的指针 InfoType * info; // 该弧相关信息的指针 }ArcNode; typedef struct VNode{ VertexType data; //顶点信息 ArcNode * Firstarc; // 指向第一条依附该顶点的弧的指针 }VNode,AdjList[INFINITY_VERTEX_NUM];
{ for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = INFINITY; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点和边权值:"; cin>>v1>>v2>>w; cout<<endl; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = w; //只要是无向就 是对称的,如果是有向就不需 要设置对称 } cout<<"\n\t创建有向网成功!"<<endl; return 1; } int CreateUDG( MGraph & G ) // --------------创建无向图 { int i, j, k; char v1, v2; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexwenku.baidu.comum>>G.arcnum; cout<<endl; if (G.arcnum > G.vexnum * ( G.vexnum - 1 ) * 0.5f ) { cout<<"\n\t输入错误!因为不满足n(n-1)/2的条件。\n"; return 0; } cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ )
cout<<"\t\t请输入"<<G.vexnum<<"个顶点的内容:"; for ( i = 0; i < G.vexnum; i++ ) { cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = INFINITY; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点和边权值:"; cin>>v1>>v2>>w; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = w; //只要是无向就 是对称的,如果是有向就不需 要设置对称 G.arcs[j][i].adj = w; G.arcs[i][j] = G.arcs[i][j]; } cout<<"\t创建无向网成功!"<<endl; return 1; } void CreateGraph(MGraph & G) //采用数组(邻接矩阵)表示法,构造G { int m,t; cout<<"\t\t你想构造哪种:"<<"\t\n\n\t\t 1DG------------------ 有向 图;\n\n\t\t 2DN------------------ 有向网;\n\n\t\t 3UDG------------------无 向图;\n\n\t\t 4UDN------------------无向网。\n\n\t\t请选择(输入 1,2,3,4):"; cin>>m; switch(m)
{ cin>>G.vexs[i]; } for ( i = 0; i < G.vexnum; i++ ) { for ( j = 0; j < G.vexnum; j++ ) { G.arcs[i][j].adj = 0; G.arcs[i][j].info = NULL; } } for ( k = 0; k < G.arcnum; k++ ) { cout<<"\t\t请输入第"<<k+1<<"边连接的两个顶点:"; cin>>v1>>v2; cout<<endl; i=Localvex(G,v1);//确定顶点V1和V2在图中的位置 j=Localvex(G,v2); G.arcs[i][j].adj = 1; G.arcs[j][i].adj = 1; } cout<<"\t创建无向图成功!"<<endl; return 1; } int CreateUDN( MGraph & G) // -----------------创建无向网 { int i, j, k; char v1, v2; int w; cout<<"\t\t输入顶点个数和弧的个数:"; cin>>G.vexnum>>G.arcnum; cout<<endl; if ( G.arcnum > G.vexnum * ( G.vexnum - 1 ) * 0.5f ) { cout<<"\n\t输入错误!因为不满足n(n-1)/2的条件。"; return 0; }