图 ADT接口 遍历运算 常规运算 邻接矩阵实现

Graph.h   (图的结构, 遍历, 常规操作接口)

 1 /*定义图的最大定点数, 它要大于等于具体图的顶点树n*/
 2 #define MaxVertexNum 12
 3
 4 /*定义图的最大边数,它要大于等于具体图的边数e*/
 5 #define MaxEdgeNum 20
 6
 7 /* 定义MaxValue 为一个符号常量,其值要大于邻接矩阵中所有有效值之和*/
 8 #define MaxValue 1000
 9
10 /*定义MS为一个符号常量,用于广度优先搜索遍历的算法中,作为自定义顺序队列的数组长度*/
11 #define MS 20
12
13 /*定义图中顶点数据的类型VertexType为整型*/
14 typedef int VertextType;
15
16 /*定义vexlist为存储顶点信息的数组类型*/
17 typedef VertexType vexlist[MaxVertexNum];
18
19 /*定义adjmatrix 为存储邻接矩阵的数组类型*/
20 typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
21
22 /*定义保存图顶点访问标记的数组*/
23 int visited[MaxVertexNum];
24
25
26
27 /*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
28 void Create1(vexlist GV, adjmatrix GA, int n, int e);
29
30 /*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
31 void dfs1(adjmatrix GA, int i, int n);
32
33 /*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
34 void bfs1(adjmatrix GA, int i, int n);

Graph.c   (图的接口实现)

 1 void Create1(vexlist GV, adjmatrix GA, int n, int e){
 2 /*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
 3      int i,j,k,w;
 4      /*建立顶点数组*/
 5      printf("输入%d个顶点数据\n", n);
 6      for(i = 0; i<n; i++) scanf("%d", &GV[i]);
 7      /*初始化邻接矩阵数组*/
 8      for(i = 0; i<n; i++)
 9          for(j = 0; j<n; j++){
10              if(i == j)GA[i][j] = 0;
11              else GA[i][j] = MaxValue;
12          }
13      /*建立邻接矩阵数组*/
14      printf("输入%d条无向带权边\n", e);
15      for(k = 1; k<=e; k++){
16          /*输入一条边的两端点序号i和j及边上的权w*/
17          scanf("%d %d %d", &i, &j, &w);
18          /*置数组中相应对称元素的值为w*/
19          GA[i][j] = GA[j][i] = w;
20      }
21
22 }
23
24
25 void dfs1(adjmatrix GA, int i, int n){
26 /*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
27      int j;
28      /*假定访问顶点Vi以输出该顶点的序号代之*/
29      printf("%d",i);
30      /*标记Vi已被访问过*/
31      visited[i] = 1;
32      /*依次搜索Vi的每个邻接点*/
33      for(j = 0; j<n; j++)
34          /*若Vi的一个有效邻接点Vj未被访问过,则从Vj出发进行递归调用*/
35          if(GA[i][j]!=0 && GA[i][j]!=MaxValue && !visited[j])
36              dfs1(GA, j, n);
37 }
38
39
40 void bfs1(adjmatrix GA, int i, int n){
41 /*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
42      /*定义一个顺序队列Q,其元素类型应为整形,初始化队列为空*/
43      int Q[MS];    //MS是一个事先定义的符号常量
44      int front = 0,rear = 0;
45      /*访问初始点Vi,同时标记初始点Vi已访问过*/
46      printf("%d" ,i);
47      visited[i] = 1;
48      /*将已访问过的初始点序号i入队*/
49      rear = (rear+1)%MS;
50      if(front == rear) {
51          printf("队列空间用完!\n");
52          exit(1);
53      }
54      Q[[rear] = i;
55
56      /*当队列非空时进行循环处理*/
57      while(front != rear){
58          int j,k;
59          /*删除队首元素,第一次执行时k的值为i*/
60          front = (front + 1)%MS;
61          k = Q[front];
62          /*依次搜索Vk的每一个可能的邻接点*/
63          for(j = 0; j<n; j++){
64              if(GA[k][j]!=0 && GA[k][j] != MaxValue&&!visited[j]){
65                  printf("%d", j);               //访问一个未被访问过的邻接节点Vj
66                  visited[j] = 1;                //标记Vj已被访问过
67                  rear = (rear+1)%MS;            //修改队尾指针
68                  if(front == rear) {
69                      printf("队列空间用完!\n");
70                      exit(1);
71                  }
72                  Q[rear] = j;
73              }
74          }
75
76      }
77 }
78                      

原文地址:https://www.cnblogs.com/WALLACE-S-BOOK/p/9941522.html

时间: 2024-10-19 23:54:26

图 ADT接口 遍历运算 常规运算 邻接矩阵实现的相关文章

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

6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVe

练习6.1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; t

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表

图的广度遍历和深度遍历

/* 图的遍历方法主要有两种:一种是深度优先遍历,一种是广度优先遍历.图的深度优先遍历类同于树的先根遍历,图的广度遍历类同树的层次遍历 一:连通图的深度优先遍历算法 图的深度优先遍历算法是遍历时深度优先的算法,即在图的所有邻接顶点中,每次都在访问当前顶点后,首先访问当前顶点的第一个邻接顶点. 连通图的深度优先遍历递归算法如下: 1.访问顶点v并标记顶点v已访问. 2.查找顶点v的第一个邻接顶点w. 3.若顶点v的邻接顶点w存在,则继续执行,否则算法结束. 4.若顶点w尚未被访问,则深度优先遍历递

数据结构(C实现)------- 图的深度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 假设给定图G的初始状态是所有顶点均未曾访问过,在G中任选一顶点vi为初始的出发点,则深度优先遍历可定义如下: 首先访问出发点vi,并将其标记为已被访问过:然后,依次从vi出发遍历vi的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历,直至图中所有和vi有路径相通的顶点都被访问到为止.因此,若G是连通图,则从初始出发点开始的遍历过程结束

数据结构(C实现)------- 图的广度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 设图G的初始状态是所有顶点均未被访问过,在G中的任选一顶点vi为初始出发点,则广度优先遍历 可定义如下:首先,访问初始出发点vi,接着依次访问vi的所有邻接点w1,w2,...,wk;然后,依次访问w1,w2,...,wk 的邻接的所有未被访问过的顶点,依次类推,直到图中所有的和初始点vi有路径相通的顶点都被访问过为止. 算法实现: (1) 访问初始顶点vi (

图的dfs遍历和bfs遍历

对如下图进行广度和深度遍历; dfs遍历,(依次输出遍历顶点): 用邻接矩阵存图(用一个二维数组把图存起来)! <span style="font-size:18px;">#include<stdio.h> #define MAX 9999999//当顶点之间不相通时,标记为一个很大的数 int sum=0;//记录遍历的顶点的个数 int v,s;//顶点数和边数 int book[50]={0},p[30][30];//标记数组和矩阵 void dfs(in

图的深度优先遍历DFS

图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件不满足后,我们就return,回到上一层,换个方向继续遍历. 模板: 1 //邻接矩阵存储方式 2 bool visited[MAX]; 3 void dfs(MGraph G,int i) 4 { 5 int j; 6 visited[i]=true; 7 cout<<G.vex[i]<&

oracle的递归运算(树运算) 无限树形

oracle的递归运算(树运算)start with org_id ='1'connect by prior parent_id=son_id 1.前言 oracle的递归运算,在我们web页面的目录结构中会经常用到,据说是面试经常出的题目,而网上的一些东西说得都不是很明了,所以自己整理了一下,以下主要通过一个例子来说明,可以直接copy代码运行一下. www.2cto.com 2.start with org_id = '条件1'  prior parent_id =  son_id; 的作用