1、 输入:将要求解的无/有向图按规则输入对应的文件 输出:通过主菜单的选择,按需实现对图的各种操作,显示结果并保存到相应的 文件中。 源程序说明: 头文件: graphics.h 函数实现:graphics.cpp 主函数: main.cpp 存放的文件说明: 无向图:graphics1.txt 存放格式为第一行存放图的顶点数n,边数b,下面每行存放两个相邻顶点:Vi,Vj 有向图:graphics2.txt 存放格式为第一行存放图的顶点数n,下面每行存放两个相邻顶点Vi-Vj: 无向图邻接表:adjlist1.txt 有向图邻接表:adjlist2.txt 无向图邻接矩阵:adjmatrix1
2、.txt 有向图邻接矩阵:adjmatrix2.txt所有抽象数据类型的定义如下:/定义邻接表的边节点类型 struct EdgeNode int adjvex; EdgeNode *next; ;/定义邻接表类型typedef EdgeNode *ADJLIST;各模块的具体实现程序是:Graphicscpp各模块的的功能及参数说明:graphics.h 如下:/对图操作的主菜单void MainMenue();/初始化邻接表void InitialAdjList(ADJLIST &GL, int n);/以文件方式输入图/bool InputGraphics();/建立图的邻接表void
3、CreatAdjList(ADJLIST &GL, int &n, int m);/建立图的邻接矩阵void CreatAdjMatrix(ADJLIST &/从初始点出发深度优先搜索由邻接表GL表示的图void DFSAdjList(ADJLIST GL, bool *&visited, int i, int n);/从初始点出发广度优先搜索由邻接表GL表示的图void BFSAdjList(ADJLIST GL, bool *&4、测试结果1、图是否有向的选择、主菜单界面:2、建立邻接表的测试结果:3、建立邻接矩阵的测试结果:4、广度优先搜索的测试结果:5、深度优先搜索的测试结果:6、退出
4、界面:5、系统不足与经验体会系统不足:异常处理不够健壮,不能够用很形象的方式打印图的直观图。经验体会:通过这次实验使我对图有了比较深入的了解,熟悉了图的基本操 作,同时也感受到了看似简单的程序实现,真正做起来很费劲,有很多的 困难需要去克服。6、附录:源代码(带注释)graphics.h 源代码如下:#ifndef GRAPHICS_H#define GRAPHICS_Hstruct EdgeNode;#endifGraphics.cpp 源代码如下:#include stdio.hstdlib.h#include graphics.h#define MAX_SIZE 100using nam
5、espace std;/部分函数原型声明void Check(int n, int &i, int &j);/全局变量,控制递归函数中提示符的输出int flag = 1;void MainMenue() coutn*endl;* * 1.建立图的邻接表。 * 2.建立图的邻接矩阵。* 3.深度优先遍历图。* 4.广度优先遍历图。* 5.退出。* fulme */* End of MainMuenue() */GL, int n)/初始化图的邻接表 GL = new EdgeNode*n; for (int i = 1; i = n; i+) GLi = NULL;/* End of Init
6、ialAdjlist() */n, int m) FILE *in1; FILE *in2; FILE *out1; FILE *out2; int i; int j; int k; int b; char ch; int flag = 0; if (m = 0) /建立无向图的邻接表 if (in1 = fopen(graphics1.txt, rb) = NULL)打开 graphics1.txt 失败! exit(1); if (out1 = fopen(adjlist1.txtwb打开 adjlist1.txt 失败! flag = 1; /读入顶点的个数, , 边数 fscanf(i
7、n1, %d, &n);%cch);b); for (k = 0; k adjvex = j; next = GLi; GLi = p; /向序号为j的单链表的表头插入一个节点 p = new EdgeNode; adjvex = i; next = GLj; GLj = p; /输出邻接表,并保存到adjlist1.txt中endln=无向图的邻接表为: for (i = 1; EdgeNode *p = GLi;i - 1 next)|-|-|p - adjvex;%s, p - adjvex);|rn if (flag)无向图的邻接表已保存到adjlist1.txt中 fclose(in
8、1); fclose(out1); else if (m = 1) /建立有向图的邻接表 if (in2 = fopen(graphics2.txt打开 graphics2.txt 失败! if (out2 = fopen(adjlist2.txt打开 adjlist2.txt 失败! fscanf(in2, /向序列号为i的表头插入一个边节点 /输出图的邻接表有向图的邻接表为: fprintf(out2, 有向图的邻接表已保存到adjlist2.txt fclose(in2); fclose(out2);/* End of CreatAdjList() */ int matrixMAX_SI
9、ZE + 1MAX_SIZE + 1; /初始化图的邻接矩阵= MAX_SIZE; for (j = 1; j j+) matrixij = 0; /建立无向图的邻接矩阵adjlmatrix1.txt打开 adjmatrix1.txt 失败! matrixij = matrixji = 1;= b;matrixij ;%d , matrixij);无向图的邻接矩阵已保存到adjmatrix1.txt中! /建立有向图的邻接矩阵adjmatrix2.txt打开 adjmatrix2.txt 失败! for (k = 1; matrixij = 1;有向图已保存到adjmatrix2.txt中!/
10、* End of CreatAdjMatrix() */visited, int i, int n)/从初始点出发递归深度优先搜索邻接表GL表示的图 flag = 0;n=n图的深度优先遍历序列:i /j为Vi的一个邻接点的序号 if (!visitedj) DFSAdjList(GL, visited, j, n); next;/* End of DFSAdjList() */从初始点开始广度优先搜索邻接表GL表示的图 const int MaxLength = 100; /定义一个队列q, 其元素类型为整型 int qMaxLength = 0; /定义队首和对尾指针 int front
11、= 0, rear = 0;n图的广度优先遍历序列: visitedj = false;/访问Vi q+rear = i; while (front != rear) /当队列非空时进行循环处理 /删除队首元素,第一次执行时k的值为i front = (front + 1) % MaxLength; int k = qfront; /取邻接表的表头指针 EdgeNode *p = GLk; /依次搜索Vk的每个节点 /Vj为Vk的一个邻接节点j= 0 &= n & j = n)n输入有误! break;/* End of Check() */main.cpp 源代码如下:int main()
12、int n; int m; /是否为有向图 bool *visited = new boolMAX_SIZE; ADJLIST gl; /初始化邻接表 InitialAdjList(gl, MAX_SIZE);=请选择图是否有向(0无/1有): cinm; MainMenue();请输入你的选择: ch; switch (ch) case 1: CreatAdjList(gl, n, m);2 CreatAdjMatrix(gl, n, m);3 visitedi = false; DFSAdjList(gl, visited, 1, n);4 BFSAdjList(gl, visited, 1, n);5 default:输入有误! return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1