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)条边的有 ...
随机推荐
- Exp1 PC平台逆向破解 20164302 王一帆
1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程 ...
- Spiring系列__03IOC补充
这篇文章是对前一篇的一些补充: 1.SpringIOC容器可以管理Bean的声明周期: 通过构造器或工厂方法创建bean的实例: 为bean属性设置值或者引入其他bean: 调用bean的初始化方法, ...
- Python3从零开始爬取今日头条的新闻【一、开发环境搭建】
Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...
- 百度语音合成AI
注意:不要使用Dw编辑PHP代码,会因为编码问题出错!!<?php require_once 'AipSpeech.php'; // 你的 APPID AK SK const APP_ID = ...
- Web框架之Django篇
1.创建Project 命令: django-admin startproject mysite 2.配置 (1)模板配置 (2)静态文件配置 (3)csrf隐藏 3.路由关系 一个url对应一个函数 ...
- JS中[object object]怎么取值
错误信息:本来是要显示JSON对象的 结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...
- Json对象与Json字符串的转化、JSON字符串与Java对象的转换
一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...
- 第三次作业(ABC类代码优化及感悟)
这次作业与林杰同学合作完成,不重复发布了. 可以直接去林杰同学的博客看.http://www.cnblogs.com/linlinlin/p/4836707.html
- FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息
在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...
- Javascript高级编程学习笔记(85)—— Canvas(2)2D上下文
2D上下文 使用2D上下文提供的方法可以绘制简单的2D图形,如矩形,弧线和路径; 2D上下文的坐标开始域<canvas>元素的左上角,原点坐标为(0,0) 后续所有操作的计算都基于原点,x ...