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)条边的有 ...
随机推荐
- Android应用程序的结构和解析
什么是Android应用程序的构成? Android应用程序的各个组件又是什么? 各个组件和AndroidManifest之间的关系是什么? Android应用程序由松散耦合的组件组成,并使用应用程序 ...
- Kafka详细配置
转自:http://blog.csdn.net/suifeng3051/article/details/38321043?utm_source=tuicool&utm_medium=refer ...
- 导航栏动态添加act属性
最近做了一个网站,需要设置导航栏的act属性,这里需要用到addClass以及removeClass: $('#topName li').removeClass('active'); $(this). ...
- 马昕璐/唐月晨 《面向对象程序设计(java)》第十一周学习总结
一:理论部分. 一般将数据结构分为两大类:线性数据结构和非线性数据结构 线性数据结构:线性表.栈.队列.串.数组和文件 非线性数据结构:树和图. 线性表:1.所有数据元素在同一个线性表中必须是相同的数 ...
- [LeetCode] Exam Room 考试房间
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...
- GYM 101617 F
说到这题还要提到周日下午训练赛,都进去了hmc说他这场单切过准备换一场. 很不幸的是我当时已经开了这个几何题, 开场就开几何是什么鬼啊!!! 给你n个圆,找一点在所有园内并且离原点最远.(保证有解) ...
- js-day06-jQuery事件和DOM操作-练习题
jQuery事件绑定 js中绑定事件,三种方式: 方式1: 直接在元素上,增加onXxx事件属性. <button onclick="alert(1);">点我< ...
- iOS URL Schemes与漏洞的碰撞组合
iOS URL Schemes与漏洞的碰撞组合 前言 iOS URL Schemes,这个单词对于大多数人来说可能有些陌生,但是类似下面这张图的提示大部分人应该都经常看见: 今天要探究的就是:了解iO ...
- Java中,多态的实现有哪些要求?实现多态的关键技术?
多态指的是允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).实现多态的方法是动态绑定( Dynamic Binding),动态绑定 ...
- [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...