Code

  1. /* '邻接矩阵' 实现无向图的创建、深度优先遍历*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define MaxVex 100 //最多顶点个数
  6. #define INFINITY 32768 //表示极大值,即 ∞
  7. #define TRUE 1
  8. #define FALSE 0
  9. #define OK 1
  10. #define ERROR 0
  11.  
  12. typedef char VertexType; //假设顶点数据类型为字符类型
  13. typedef int EdgeType; //对于无权图,用1或0表示是否相邻,对带权图,则为权值类型
  14. typedef struct
  15. {
  16. VertexType vertex[MaxVex]; //顶点数组
  17. EdgeType arcs[MaxVex][MaxVex]; //邻接矩阵
  18. int vexnum,arcnum; //图中的顶点数和边数
  19. }Graph;
  20.  
  21. int visited[MaxVex]; //访问标志数组
  22.  
  23. /**********************各个子函数的定义*********************/
  24. void init(Graph *G); //初始化邻接矩阵
  25. int LocateVertex(Graph *G,VertexType v);//求顶点位置函数
  26. int createUDG(Graph *G); //创建一个无向图
  27. void DepthFirstSearch(Graph G, int i); //图的深度优先遍历
  28. void TraverseGraph(Graph G);
  29.  
  30. /**************************主函数*************************/
  31. int main()
  32. {
  33. Graph G;
  34. int choice;
  35. while(true)
  36. {
  37. printf("*****************Please enter your choice*****************\n\n");
  38. printf(" choice 1:Initialization\n");
  39. printf(" choice 2:Create Graph\n");
  40. printf(" choice 3:Depth First Search\n");
  41. printf(" choice 0:exit\n\n");
  42. scanf("%d",&choice);
  43. switch(choice)
  44. {
  45. case :
  46. init(&G);
  47. break;
  48. case :
  49. (createUDG(&G)==)?printf("Create Graph success.\n"):printf("Create Graph ERROR\n");
  50. break;
  51. case :
  52. printf("图的深度优先遍历为: ");
  53. TraverseGraph(G);
  54. break;
  55. case :
  56. exit();
  57. break;
  58. default:
  59. printf("ERROR!!\n");
  60. exit();
  61. break;
  62. }
  63. }
  64. return ;
  65. }
  66.  
  67. /**********************各个子函数功能的实现*********************/
  68. void init(Graph *G) //初始化邻接矩阵
  69. {
  70. int i,j;
  71. printf("请输入图的顶点个数和边数:");
  72. scanf("%d %d",&(G->vexnum),&(G->arcnum));//输入图的顶点个数和边数
  73. for(i=;i<G->vexnum;i++) //初始化
  74. {
  75. for(j=;j<G->vexnum;j++)
  76. {
  77. G->arcs[i][j]=INFINITY;
  78. }
  79. }
  80. printf("图的初始化成功\n");
  81. }
  82.  
  83. int LocateVertex(Graph *G,VertexType v) //查找并返回顶点的位置
  84. {
  85. int j=,k;
  86. for(k=;k<G->vexnum;k++)
  87. {
  88. if(G->vertex[k]==v)
  89. {
  90. j=k;
  91. break;
  92. }
  93. }
  94. return j;
  95. }
  96.  
  97. int createUDG(Graph *G) //创建一个无向图
  98. {
  99. int i,j,k,weight;
  100. VertexType v1,v2;
  101. for(i=;i<G->vexnum;i++)
  102. {
  103. printf("请输入图的第 %d 顶点:",i+);
  104. getchar();
  105. scanf("%c",&(G->vertex[i])); //输入图的顶点集
  106. }
  107. for(k=;k<G->arcnum;k++)
  108. {
  109. printf("请分别输入图的第 %d 条边的两个顶点和权值",k+);
  110. getchar();
  111. scanf("%c %c %d",&v1,&v2,&weight);//输入一条边的两个顶点、权值
  112. i=LocateVertex(G,v1);
  113. j=LocateVertex(G,v2);
  114. G->arcs[i][j]=weight; //建立顶点之间的关系
  115. G->arcs[j][i]=weight;
  116. }
  117. return OK;
  118. }
  119.  
  120. void DepthFirstSearch(Graph G, int i) //图的深度优先遍历
  121. {
  122. int j;
  123. visited[i] = TRUE;
  124. printf("%c ",G.vertex[i]);
  125. for (j=; j<G.vexnum; j++)
  126. {
  127. if (G.arcs[i][j]!=INFINITY && !visited[j])
  128. DepthFirstSearch(G,j);
  129. }
  130. }
  131.  
  132. void TraverseGraph(Graph G)
  133. {
  134. int i;
  135. for (i=; i<G.vexnum; i++) //初始化访问标志数组
  136. visited[i] = FALSE;
  137.  
  138. for (i=; i<G.vexnum; i++)//循环调用深度优先遍历连通子图的操作,若图G是连通图,则此调用只执行一次
  139. {
  140. if (!visited[i])
  141. DepthFirstSearch(G, i);
  142. }
  143. printf("\n");
  144. }

代码测试

​​

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. Exp1 PC平台逆向破解 20164302 王一帆

    1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程 ...

  2. Spiring系列__03IOC补充

    这篇文章是对前一篇的一些补充: 1.SpringIOC容器可以管理Bean的声明周期: 通过构造器或工厂方法创建bean的实例: 为bean属性设置值或者引入其他bean: 调用bean的初始化方法, ...

  3. Python3从零开始爬取今日头条的新闻【一、开发环境搭建】

    Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...

  4. 百度语音合成AI

    注意:不要使用Dw编辑PHP代码,会因为编码问题出错!!<?php require_once 'AipSpeech.php'; // 你的 APPID AK SK const APP_ID = ...

  5. Web框架之Django篇

    1.创建Project 命令: django-admin startproject mysite 2.配置 (1)模板配置 (2)静态文件配置 (3)csrf隐藏 3.路由关系 一个url对应一个函数 ...

  6. JS中[object object]怎么取值

    错误信息:本来是要显示JSON对象的  结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...

  7. Json对象与Json字符串的转化、JSON字符串与Java对象的转换

    一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...

  8. 第三次作业(ABC类代码优化及感悟)

    这次作业与林杰同学合作完成,不重复发布了. 可以直接去林杰同学的博客看.http://www.cnblogs.com/linlinlin/p/4836707.html

  9. FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

    在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...

  10. Javascript高级编程学习笔记(85)—— Canvas(2)2D上下文

    2D上下文 使用2D上下文提供的方法可以绘制简单的2D图形,如矩形,弧线和路径; 2D上下文的坐标开始域<canvas>元素的左上角,原点坐标为(0,0) 后续所有操作的计算都基于原点,x ...