考研图C语言深度优先遍历代码及注释

时间: 2023-08-18 13:37:46 浏览: 53
好的,以下是C语言实现深度优先遍历的代码及注释: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大顶点数 #define MAX_ARC_NUM 500 // 最大边数 typedef int VertexType; // 顶点的数据类型 typedef struct { VertexType vexs[MAX_VERTEX_NUM]; // 顶点数组 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vexnum, arcnum; // 顶点数和边数 } MGraph; // 图的邻接矩阵表示法 typedef struct { VertexType data; // 数据域 int firstarc; // 头结点 } VNode; typedef struct { VNode adjlist[MAX_VERTEX_NUM]; // 邻接表 int vexnum, arcnum; // 顶点数和边数 } ALGraph; // 图的邻接表表示法 // 初始化邻接矩阵图 void InitMGraph(MGraph *G) { int i, j; for (i = 0; i < MAX_VERTEX_NUM; i++) { for (j = 0; j < MAX_VERTEX_NUM; j++) { G->arcs[i][j] = 0; // 初始化为0 } } G->vexnum = 0; G->arcnum = 0; } // 添加顶点到邻接矩阵图 void AddVertexToMGraph(MGraph *G, VertexType v) { G->vexs[G->vexnum++] = v; // 加入顶点数组 } // 添加边到邻接矩阵图 void AddEdgeToMGraph(MGraph *G, int v1, int v2) { G->arcs[v1][v2] = 1; G->arcs[v2][v1] = 1; // 无向图,所以要添加两条边 G->arcnum++; // 边数加1 } // 初始化邻接表图 void InitALGraph(ALGraph *G) { int i; for (i = 0; i < MAX_VERTEX_NUM; i++) { G->adjlist[i].firstarc = -1; // 初始化为-1 } G->vexnum = 0; G->arcnum = 0; } // 添加顶点到邻接表图 void AddVertexToALGraph(ALGraph *G, VertexType v) { G->adjlist[G->vexnum].data = v; // 加入数据 G->vexnum++; // 顶点数加1 } // 添加边到邻接表图 void AddEdgeToALGraph(ALGraph *G, int v1, int v2) { ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = v2; // 邻接点为v2 p->nextarc = G->adjlist[v1].firstarc; // 头插法 G->adjlist[v1].firstarc = p; // 头节点指向新节点 G->arcnum++; // 边数加1 } // 深度优先遍历邻接矩阵图 void DFSTraverseMGraph(MGraph G, int v, int visited[]) { printf("%d ", v); // 访问该顶点 visited[v] = 1; // 标记为已访问 int i; for (i = 0; i < G.vexnum; i++) { if (G.arcs[v][i] == 1 && !visited[i]) { // 如果存在边且未访问 DFSTraverseMGraph(G, i, visited); // 递归访问邻接点 } } } // 深度优先遍历邻接表图 void DFS(ALGraph *G, int v, int visited[]) { printf("%d ", v); // 访问该顶点 visited[v] = 1; // 标记为已访问 ArcNode *p = G->adjlist[v].firstarc; while (p != NULL) { if (!visited[p->adjvex]) { // 如果邻接点未访问 DFS(G, p->adjvex, visited); // 递归访问邻接点 } p = p->nextarc; // 访问下一个邻接点 } } int main() { MGraph G; InitMGraph(&G); AddVertexToMGraph(&G, 1); AddVertexToMGraph(&G, 2); AddVertexToMGraph(&G, 3); AddVertexToMGraph(&G, 4); AddVertexToMGraph(&G, 5); AddEdgeToMGraph(&G, 0, 1); AddEdgeToMGraph(&G, 0, 2); AddEdgeToMGraph(&G, 1, 3); AddEdgeToMGraph(&G, 1, 4); int visited[MAX_VERTEX_NUM] = {0}; DFSTraverseMGraph(G, 0, visited); ALGraph G; InitALGraph(&G); AddVertexToALGraph(&G, 1); AddVertexToALGraph(&G, 2); AddVertexToALGraph(&G, 3); AddVertexToALGraph(&G, 4); AddVertexToALGraph(&G, 5); AddEdgeToALGraph(&G, 0, 1); AddEdgeToALGraph(&G, 0, 2); AddEdgeToALGraph(&G, 1, 3); AddEdgeToALGraph(&G, 1, 4); int visited[MAX_VERTEX_NUM] = {0}; DFS(&G, 0, visited); return 0; } ``` 这里实现了两种图的表示方法:邻接矩阵和邻接表,分别对应 `MGraph` 和 `ALGraph` 结构体。其中,邻接矩阵使用二维数组表示,邻接表使用链表表示。在添加顶点和边的函数中,都是将数据存储到对应的结构体中,同时更新顶点数和边数。在深度优先遍历函数中,使用递归的方式遍历图,标记已访问的节点,避免重复访问。

相关推荐

最新推荐

recommend-type

计算机考研复试C语言简答题资料

适用于考研党C语言线上复试问答~
recommend-type

考研复试c语言程序设计的细节总结.doc

计算机/软件类研究生复试机试一般都会采用c语言作为标准语言,对于长期未使用c语言的考生来说需要先复习一下c语言的基本操作如输入输出的格式控制、字符串操作函数、运算符优先级等等知识点,这样才不会出现有了编程...
recommend-type

C语言或者考研复试上机练习题.doc

适合于考研复试简单上机练习,或者边学习C语言课本边练习的初学者。有C语言的课后练习题,也有稍微高于课后练习题难度的题目,属于入门题目。
recommend-type

2013年安徽大学考研复试C语言试题

2013年安徽大学考研复试科目C语言考试试卷,信号与信息处理,电子与通信工程,电路,集成电路专业复试试卷
recommend-type

C语言程序设计+研究生复试+求职+面试题

包括C语言程序设计基本概念及各章节问题回答。可供研究生复试或相关专业岗位面试使用。如: 简述C语⾔采取了哪些措施提⾼执⾏效率; ⼆维数组在物理上以及逻辑上的数组维度理解; 隐式类型转换的四种情况; 结构体对...
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/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

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