C语言实现邻接矩阵创建无向图&图的深度优先遍历
Code
/* '邻接矩阵' 实现无向图的创建、深度优先遍历*/
#include <stdio.h>
#include <stdlib.h> #define MaxVex 100 //最多顶点个数
#define INFINITY 32768 //表示极大值,即 ∞
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0 typedef char VertexType; //假设顶点数据类型为字符类型
typedef int EdgeType; //对于无权图,用1或0表示是否相邻,对带权图,则为权值类型
typedef struct
{
VertexType vertex[MaxVex]; //顶点数组
EdgeType arcs[MaxVex][MaxVex]; //邻接矩阵
int vexnum,arcnum; //图中的顶点数和边数
}Graph; int visited[MaxVex]; //访问标志数组 /**********************各个子函数的定义*********************/
void init(Graph *G); //初始化邻接矩阵
int LocateVertex(Graph *G,VertexType v);//求顶点位置函数
int createUDG(Graph *G); //创建一个无向图
void DepthFirstSearch(Graph G, int i); //图的深度优先遍历
void TraverseGraph(Graph G); /**************************主函数*************************/
int main()
{
Graph G;
int choice;
while(true)
{
printf("*****************Please enter your choice*****************\n\n");
printf(" choice 1:Initialization\n");
printf(" choice 2:Create Graph\n");
printf(" choice 3:Depth First Search\n");
printf(" choice 0:exit\n\n");
scanf("%d",&choice);
switch(choice)
{
case :
init(&G);
break;
case :
(createUDG(&G)==)?printf("Create Graph success.\n"):printf("Create Graph ERROR\n");
break;
case :
printf("图的深度优先遍历为: ");
TraverseGraph(G);
break;
case :
exit();
break;
default:
printf("ERROR!!\n");
exit();
break;
}
}
return ;
} /**********************各个子函数功能的实现*********************/
void init(Graph *G) //初始化邻接矩阵
{
int i,j;
printf("请输入图的顶点个数和边数:");
scanf("%d %d",&(G->vexnum),&(G->arcnum));//输入图的顶点个数和边数
for(i=;i<G->vexnum;i++) //初始化
{
for(j=;j<G->vexnum;j++)
{
G->arcs[i][j]=INFINITY;
}
}
printf("图的初始化成功\n");
} int LocateVertex(Graph *G,VertexType v) //查找并返回顶点的位置
{
int j=,k;
for(k=;k<G->vexnum;k++)
{
if(G->vertex[k]==v)
{
j=k;
break;
}
}
return j;
} int createUDG(Graph *G) //创建一个无向图
{
int i,j,k,weight;
VertexType v1,v2;
for(i=;i<G->vexnum;i++)
{
printf("请输入图的第 %d 顶点:",i+);
getchar();
scanf("%c",&(G->vertex[i])); //输入图的顶点集
}
for(k=;k<G->arcnum;k++)
{
printf("请分别输入图的第 %d 条边的两个顶点和权值",k+);
getchar();
scanf("%c %c %d",&v1,&v2,&weight);//输入一条边的两个顶点、权值
i=LocateVertex(G,v1);
j=LocateVertex(G,v2);
G->arcs[i][j]=weight; //建立顶点之间的关系
G->arcs[j][i]=weight;
}
return OK;
} void DepthFirstSearch(Graph G, int i) //图的深度优先遍历
{
int j;
visited[i] = TRUE;
printf("%c ",G.vertex[i]);
for (j=; j<G.vexnum; j++)
{
if (G.arcs[i][j]!=INFINITY && !visited[j])
DepthFirstSearch(G,j);
}
} void TraverseGraph(Graph G)
{
int i;
for (i=; i<G.vexnum; i++) //初始化访问标志数组
visited[i] = FALSE; for (i=; i<G.vexnum; i++)//循环调用深度优先遍历连通子图的操作,若图G是连通图,则此调用只执行一次
{
if (!visited[i])
DepthFirstSearch(G, i);
}
printf("\n");
}
代码测试
C语言实现邻接矩阵创建无向图&图的深度优先遍历的更多相关文章
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 图论 - 图的深度优先遍历c++实现
图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...
- 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)
1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...
- 图的深度优先遍历DFS
图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...
- 图的深度优先遍历(DFS) c++ 非递归实现
深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...
- 图的深度优先遍历(DFS)—递归算法
实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...
- java实现图的深度优先遍历和广度优先遍
首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕:如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先 ...
- 1047图的深度优先遍历c语言
描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...
- 图的深度优先遍历&广度优先遍历
1.什么是图的搜索? 指从一个指定顶点可以到达哪些顶点 2.无向完全图和有向完全图 将具有n(n-1)/2条边的无向图称为无向完全图(完全图就是任意两个顶点都存在边). 将具有n(n-1)条边的有 ...
随机推荐
- 关于docker jenkins启动时失败的问题处理
最近在做持续集成,然后使用docker 运行jenkins docker run -d -p 8088:8080 -p 50000:50000 -v /home/docker/jenkins_hom ...
- vue + websocket 的使用
阳光正好,我们正在努力前行. 一.引言 初始使用websocket ,一开始看文档的时候,觉得很简单,只需要创建websocket实例,然后有几个监听打开连接,监听关闭连接,监听连接异常等方法.但是, ...
- Spring整合MybatisPlus学习笔记
简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生 特性 无侵入:只做增强不做改变,引入它不会对现有 ...
- framework7 入门(基础布局)
个人认为framework7是个很好的移动端框架,自带路由.下拉刷新.无限加载.时间线.各种dialog.环形图等,基本能满足大部分app的需求,可以和vue,webpack 等各种搭配. 这里讲一下 ...
- 关于using namespace std
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~关于using namespace std ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- Lua学习----零碎知识点
Jit(just in time) 动态即时编译,边运行时边编译---->lua (主要是面向进程) Aot(ahead of time) 静态提前编译,运行前编译---->C#(主要是面 ...
- Unity进阶----AssetBundle_03(2018/11/07)
1. 为啥有AB包? 因为资源需要更新, 避免更新一次打包一次 动态修改. 2. AB包注意啥? 依赖关系 找依赖关系应该找到对应的平台!!! 3. 打包策略是分场景打包 若文件被文件夹包含打包出来的 ...
- 大数据BI框架知识点备注
将这段时间的一些基于大数据方案的BI知识点暂时做些规整,可能还存在较多问题,后续逐步完善修改. 数据模型: 1.星型模型和雪花模型,同样是将业务表拆分成事实表和纬度表:例如一个员工数据表,可以拆分为员 ...
- PHP GZIP压缩+BASE64
<?php $str = ' {"pf":"AC25c","dt":"2017-02-04 09:49:49",& ...
- Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
像旋转三角形一样,通过预设程序来让对象移动对于吸引注意是很有用的,但是如果你想让你的OpenGL图形有用户交互呢?让你的OpenGL ES应用有触摸交互的关键是,扩展你的GLSurfaceView的实 ...