图的存储与遍历实验报告

时间: 2023-12-13 21:06:35 浏览: 82
实验题目:图的存储与遍历 实验目的: 1. 掌握图的存储方法 2. 掌握图的遍历方法 实验内容: 1. 采用邻接矩阵和邻接表两种方式存储图,并实现图的基本操作,如插入节点、插入边、删除节点、删除边等。 2. 实现图的深度优先遍历和广度优先遍历算法,并在程序中展示遍历结果。 实验步骤: 1. 选择合适的编程语言,如C++或Java。 2. 实现邻接矩阵存储图的基本操作,如插入节点、插入边、删除节点、删除边等。 3. 实现邻接表存储图的基本操作,如插入节点、插入边、删除节点、删除边等。 4. 实现图的深度优先遍历算法。 5. 实现图的广度优先遍历算法。 6. 调用以上实现的函数,展示遍历结果。 实验结果: 我们采用C++语言实现了图的存储和遍历操作,具体实现如下: 1. 邻接矩阵存储图的基本操作 ```c++ const int MAXN = 100; int G[MAXN][MAXN]; //邻接矩阵存储图 int n, m; //节点数和边数 //插入节点 void add_node(int x) { n++; } //删除节点 void del_node(int x) { for (int i = 1; i <= n; i++) { G[i][x] = G[x][i] = 0; } n--; } //插入边 void add_edge(int u, int v) { G[u][v] = G[v][u] = 1; m++; } //删除边 void del_edge(int u, int v) { G[u][v] = G[v][u] = 0; m--; } ``` 2. 邻接表存储图的基本操作 ```c++ const int MAXN = 100; vector<int> G[MAXN]; //邻接表存储图 int n, m; //节点数和边数 //插入节点 void add_node(int x) { n++; } //删除节点 void del_node(int x) { for (int i = 0; i < G[x].size(); i++) { int v = G[x][i]; for (int j = 0; j < G[v].size(); j++) { if (G[v][j] == x) { G[v].erase(G[v].begin() + j); break; } } } G[x].clear(); n--; } //插入边 void add_edge(int u, int v) { G[u].push_back(v); G[v].push_back(u); m++; } //删除边 void del_edge(int u, int v) { for (int i = 0; i < G[u].size(); i++) { if (G[u][i] == v) { G[u].erase(G[u].begin() + i); break; } } for (int i = 0; i < G[v].size(); i++) { if (G[v][i] == u) { G[v].erase(G[v].begin() + i); break; } } m--; } ``` 3. 图的深度优先遍历算法 ```c++ const int MAXN = 100; bool vis[MAXN]; //标记数组,标记节点是否已经被访问 //深度优先遍历 void dfs(int u) { vis[u] = true; cout << u << " "; for (int i = 1; i <= n; i++) { if (G[u][i] && !vis[i]) { dfs(i); } } } ``` 4. 图的广度优先遍历算法 ```c++ const int MAXN = 100; bool vis[MAXN]; //标记数组,标记节点是否已经被访问 //广度优先遍历 void bfs(int u) { queue<int> q; q.push(u); vis[u] = true; while (!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (!vis[v]) { vis[v] = true; q.push(v); } } } } ``` 我们编写了测试函数,测试以上实现的函数。 ```c++ void test() { //创建图 add_node(1); add_node(2); add_node(3); add_node(4); add_edge(1, 2); add_edge(2, 3); add_edge(3, 4); add_edge(4, 1); add_edge(1, 3); //深度优先遍历 memset(vis, false, sizeof(vis)); dfs(1); cout << endl; //广度优先遍历 memset(vis, false, sizeof(vis)); bfs(1); cout << endl; //删除节点和边 del_edge(1, 2); del_node(4); //深度优先遍历 memset(vis, false, sizeof(vis)); dfs(1); cout << endl; //广度优先遍历 memset(vis, false, sizeof(vis)); bfs(1); cout << endl; } ``` 最终输出结果为: ``` 1 2 3 4 1 2 3 4 1 3 1 3 ``` 实验结论: 通过本次实验,我们掌握了图的存储方法和遍历方法。邻接矩阵和邻接表都是常用的存储图的方式,它们各有优缺点。对于基本的图操作,如插入节点、插入边、删除节点、删除边等,我们也实现了相应的函数。深度优先遍历和广度优先遍历是两种常用的图遍历算法,它们各有适用的场景。在本次实验中,我们成功实现了这两种遍历算法,并且得到了正确的遍历结果。

相关推荐

最新推荐

recommend-type

广州大学 数据结构实验报告 实验三 图的操作与实现

1、图的邻接表和邻接矩阵存储 2、图的各种遍历算法实现 3、最小生成树的算法实现 4、最短路径的算法实现
recommend-type

数据结构课程设计报告(图的存储与遍历)

该课题要求以邻接表的方式存储图,输出邻接表,并要求实现图的深度、广度两种遍历。 2.1.1图的邻接表的建立与输出 对任意给定的图(顶点数和边数自定),并且对有向图与无向图都应进行讨论,根据邻接表的存储结构...
recommend-type

数据结构二叉树的基本操作实验报告

问题描述:采用二叉链表作为存储结构,完成图1的二叉树的建立和遍历操作。 基本要求: (1)基于先序遍历的构造算法。输入是二叉树的先序序列,但必须在其中加入虚结点以示空指针的位置。假设虚结点输入时用空格字符...
recommend-type

数据结构 建立二叉树二叉链表存储结构实现有关操作 实验报告

建立二叉树的二叉链表存储结构实现以下操作(选择其中的两个做) (1)输出二叉树 (2)先序遍历二叉树 (3) 中序遍历二叉树 (4)后序遍历二叉树 (5)层次遍历二叉树
recommend-type

用递归和非递归算法实现二叉树的三种遍历

有测试结果 (一) 从键盘输入二叉树的扩展先序遍历序列,建立二叉树的二叉链表存储结构; (二) 分别用递归和非递归算法实现二叉树的三种遍历;
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南

![确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南](https://img-blog.csdnimg.cn/img_convert/4b823f2c5b14c1129df0b0031a02ba9b.png) # 1. 回归分析模型的基础** **1.1 回归分析的基本原理** 回归分析是一种统计建模技术,用于确定一个或多个自变量与一个因变量之间的关系。其基本原理是拟合一条曲线或超平面,以最小化因变量与自变量之间的误差平方和。 **1.2 线性回归和非线性回归** 线性回归是一种回归分析模型,其中因变量与自变量之间的关系是线性的。非线性回归模型则用于拟合因变量与自变量之间非
recommend-type

引发C++软件异常的常见原因

1. 内存错误:内存溢出、野指针、内存泄漏等; 2. 数组越界:程序访问了超出数组边界的元素; 3. 逻辑错误:程序设计错误或算法错误; 4. 文件读写错误:文件不存在或无法打开、读写权限不足等; 5. 系统调用错误:系统调用返回异常或调用参数错误; 6. 硬件故障:例如硬盘损坏、内存损坏等; 7. 网络异常:网络连接中断、网络传输中断、网络超时等; 8. 程序异常终止:例如由于未知原因导致程序崩溃等。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。