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语言实现邻接矩阵创建无向图&图的深度优先遍历的更多相关文章

  1. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

  2. 图论 - 图的深度优先遍历c++实现

    图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...

  3. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

  4. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  5. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  6. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  7. java实现图的深度优先遍历和广度优先遍

    首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕:如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先 ...

  8. 1047图的深度优先遍历c语言

    描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...

  9. 图的深度优先遍历&广度优先遍历

    1.什么是图的搜索? 指从一个指定顶点可以到达哪些顶点   2.无向完全图和有向完全图 将具有n(n-1)/2条边的无向图称为无向完全图(完全图就是任意两个顶点都存在边). 将具有n(n-1)条边的有 ...

随机推荐

  1. MQTT之Mosquitto

    https://mosquitto.org/ Eclipse Mosquitto是一个开源(EPL / EDL许可)消息代理,它实现了MQTT协议版本3.1和3.1.1.Mosquitto重量轻,适用 ...

  2. CentOS7 VMware-Tools安装与共享文件夹设置

    一. VMware-Tools安装 1.加载VMware Tools的光驱:点击"虚拟机"->"安装VMware Tools".这里,由于我已经安装了,所 ...

  3. fildder

    来自 墨痕 :https://home.cnblogs.com/u/ink-marks/ FIDDLER的使用方法及技巧总结   一.FIDDLER快速入门及使用场景 Fiddler的官方网站:htt ...

  4. vbs脚本实现qq定时发消息(初级)

    vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利 ...

  5. Tensor索引操作

    #Tensor索引操作 ''''' Tensor支持与numpy.ndarray类似的索引操作,语法上也类似 如无特殊说明,索引出来的结果与原tensor共享内存,即修改一个,另一个会跟着修改 ''' ...

  6. 转发 Learning Go — from zero to hero

    原文:https://medium.freecodecamp.org/learning-go-from-zero-to-hero-d2a3223b3d86 Learning Go — from zer ...

  7. django介绍及路由系统

    第一:Python的web框架介绍 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引 ...

  8. 数据库mysql大全(高级版)

    1.说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 备份数据 ...

  9. EDI

    EDI, Electronic Data Interchange,电子数据交换 EDI 商务是指将商业或行政事务按一个公认的标准,形成结构化的事务处理或文档数据格式,从计算机到计算机的电子传输方法.简 ...

  10. ArrayList源码理解

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Col ...