图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

我们来看一个实例,图7-4-2的左图就是一个无向图。

我们再来看一个有向图样例,如图7-4-3所示的左图。

在图的术语中,我们提到了网的概念,也就是每条边上都带有权的图叫做网。那些这些权值就需要保存下来。

设图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

如图7-4-4左图就是一个有向网图。

代码:

#include <stdio.h>
#include <malloc.h>
#define MAX_VALUE 0x7fffffff//当两个点不相连是路径的权为无穷大
#define MAX_NUM 100//最多可存放点的个数
typedef char node_type;typedef struct matrix
{node_type vertex[MAX_NUM];//节点信息int arcs[MAX_NUM][MAX_NUM];//矩阵int vertexs, brim;//节点数,边数
} Graph;typedef struct node
{int data;node *next;
} Node,*LinkQueueNode;typedef struct
{LinkQueueNode front; //队头指针LinkQueueNode rear;  //队尾指针
} LinkQueue;bool visit[MAX_NUM]= {false};
bool InitQueue(LinkQueue *Q);//链队列初始化
bool EnterQueue(LinkQueue *Q,int x);//入队,将数据元素x插入到队列Q中
bool DeleteQueue(LinkQueue *Q,int *x);//出队,将队列Q的队头元素出队并保存到x所指的存储空间中
bool IsEmpty(LinkQueue *Q);//判断链队列是否为空
void GetHead(LinkQueue *Q,int *x);//取得链队列的头部元素
void create(Graph *graph);
void printMatrix(Graph *graph);//打印矩阵状态
void depth_first_search(Graph *graph,int i);//深度优先遍历
void breadth_first_search(Graph *graph);//广度优先遍历int main(void)
{Graph graph;create(&graph);printf("对应的矩阵为:\n");printMatrix(&graph);printf("图中共有%d条边\n",graph.brim);visit[0]=true;printf("深度优先遍历:\n");depth_first_search(&graph,0);printf("\n");printf("广度优先遍历:\n");breadth_first_search(&graph);return 0;
}bool InitQueue(LinkQueue *Q)//链队列初始化
{Q->front=(LinkQueueNode)malloc(sizeof(Node));if(Q->front!=NULL){Q->rear=Q->front;Q->front->next=NULL;return true;}elsereturn false;//溢出
}bool EnterQueue(LinkQueue *Q,int x)//入队,将数据元素x插入到队列Q中
{LinkQueueNode NewNode;NewNode=(LinkQueueNode)malloc(sizeof(Node));if(NewNode!=NULL){NewNode->data=x;NewNode->next=NULL;Q->rear->next=NewNode;Q->rear=NewNode;}elsereturn false;//溢出
}bool DeleteQueue(LinkQueue *Q,int *x)//出队,将队列Q的队头元素出队并保存到x所指的存储空间中
{LinkQueueNode p;if(Q->front==Q->rear)//表示队列已空return false;p=Q->front->next;Q->front->next=p->next;//队头元素p出队if(Q->rear==p)//如果队中只有一个元素p,则p出队后成为空队Q->rear=Q->front;*x=p->data;free(p);//释放存储空间return true;
}bool IsEmpty(LinkQueue *Q)//判断链队列是否为空
{return Q->front == Q->rear;
}void create(Graph *graph)
{int num;char c;printf("输入节点个数:\n");scanf("%d", &graph->vertexs);getchar();//吃掉回车符printf("输入节点信息:\n");for (int i = 0; i < graph->vertexs; i++ )scanf("%c", &graph->vertex[i]);getchar();for (int i = 0; i < graph->vertexs; i++ )//初始化矩阵for ( int j = 0; j < graph->vertexs; j++ )graph->arcs[i][j] = MAX_VALUE;graph->brim = 0;//初始化边数for (int i = 0; i < graph->vertexs; i++ ){printf("输入与%c节点相邻的节点与权值,输入“.”号键结束\n", graph->vertex[i]);for (int j = 0; j < graph->vertexs; j++ ){scanf("%c", &c);if ( c == '.' ){getchar();break;}scanf("%d", &num);for (int k = 0; k < graph->vertexs; k++ )if ( graph->vertex[k] == c ){graph->arcs[i][k] = num;graph->brim++;}getchar();}}graph->brim /= 2;
}void g_printMatrix(Graph *graph)//打印矩阵状态
{int i, j;for ( i = 0; i < graph->vertexs; i++ ){for ( j = 0; j < graph->vertexs; j++ )printf("%-10d ", graph->arcs[i][j]);printf("\n");}
}void printMatrix(Graph *graph)//打印矩阵状态
{for ( int i = 0; i < graph->vertexs; i++ ){for ( int j = 0; j < graph->vertexs; j++ )printf("%d ", graph->arcs[i][j]);printf("\n");}
}void depth_first_search(Graph *graph,int i)
{printf("%c\t",graph->vertex[i]);for(int j=0; j<graph->vertexs; j++)if ( graph->arcs[i][j] != MAX_VALUE && !visit[j] )//i 代表矩阵的行, j 代表矩阵的列{visit[j] = true;depth_first_search(graph,j);}
}void breadth_first_search(Graph * graph)
{LinkQueue queue;//队列存储的是节点数组的下标(int)int pos;InitQueue(&queue);for (int i = 1; i < MAX_NUM; i++ )visit[i] = false;visit[0] = true;EnterQueue(&queue, 0);while (!IsEmpty(&queue) ){GetHead(&queue,&pos);printf("%c\t", graph->vertex[pos]);for (int i = 0; i < graph->vertexs; i++ )//把队头元素的邻接点入队if (!visit[i] && graph->arcs[pos][i] != MAX_VALUE ){visit[i] = true;EnterQueue(&queue, i);}DeleteQueue(&queue,&pos);}printf("\n");
}void GetHead(LinkQueue *Q,int *x)//取得链队列的头部元素
{if(IsEmpty(Q))printf("链队列为空!\n");else*x = Q->front->next->data;
}

图的邻接矩阵存储及遍历相关推荐

  1. 图的邻接矩阵存储及遍历操作

    第1关:图的邻接矩阵存储及求邻接点操作 任务描述 本关任务:要求从文件输入顶点和边数据,包括顶点信息.边.权值等,编写程序实现以下功能. 1)构造无向网G的邻接矩阵和顶点集,即图的存储结构为邻接矩阵. ...

  2. 图的邻接矩阵存储(简单代码实现)

    说起来邻接矩阵,对于学过线性代数的同学理解起来非常简单 其实就是一个数字组成方阵,每一个数字都能有有意义的代表一些信息. 下面来看一个例子 如上图所示的图,使用邻接矩阵存储的话应该是下面的情况 由此可 ...

  3. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

    邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visi ...

  4. 图的邻接矩阵存储和邻接表存储定义方法

    一.邻接矩阵 #include <iostream> using namespace std; #define MaxVertexNum 100 //顶点最大数目//邻接矩阵存储结构 ty ...

  5. 图的定义存储和遍历(一级)

    图:是一种多对多的关系,图这一块我们不进行过多的说明我们这里又一个高德地图搜索路径的截图,我们要搜索起点北京大学的总校区,重点是清华大学,我现在选择的是驾车而不是公交,如果是公交可能有其他的路径,如果 ...

  6. C语言 数据结构 图的邻接矩阵存储 基本操作(附输入样例和讲解)

    代码参照了严蔚敏.吴伟民编写的数据结构(C语言版). 部分内容参考了这位大佬: https://blog.csdn.net/jeffleo/article/details/53326648 所有代码采 ...

  7. 图的邻接矩阵存储结构

    如上图,我们能够把v0标记为0,v1标记为1.... 并把联通的2点权值全设置为1,那么能够用邻接矩阵(右图)来表示 概念解析: 第一个邻接顶点: 我们以vo为例,第一个邻接顶点为V1(事实上也能够使 ...

  8. 7.连连看的数据结构与算法(数组存储和图的邻接矩阵存储)。

    存储连连看地图可以用数组存储,也可以用把地图当做图来处理,用邻接矩阵来存储. 下面展示这两种方法的区别: 初始化图中边的算法思想: 其中有使用typedef语句定义数组类型https://www.cn ...

  9. 用c语言实现图的基本存储,图的邻接矩阵存储(C语言实现)

    #include #define INFINITY 1000 #define MAX_VERTEX_NUM 20 #define ERROR 0 #define OK 1 typedef enum{D ...

最新文章

  1. SpringMVC基础——一个简单的例子
  2. CodeForces - 570E(dp------------- Codeforces Round #316 (Div. 2)E
  3. 08-数组中常用的属性及方法
  4. ios pusher使用_使用.NET和Pusher构建实时评论功能
  5. python 分位数计算代码_Python数据分析第十一节 数据运算
  6. NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifest
  7. IDEA 插件开发入门教程 1
  8. 四川大学计算机软件技术基础,四川大学《计算机软件技术基础》复习题2及答案#.doc...
  9. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
  10. 跨域资源请求(除jsonp以外)的方法
  11. 多个 本地仓库_老板逼我用 Git,本地指令介绍
  12. 服务器如何装linux 系统教程,教程/操作系统 手把手教你装Linux系统
  13. 发邮件+实习+简历+
  14. SQL注入实战 绕WTS-WAF
  15. 华为H3CNE认证题库、教材-热门下载帖汇总!
  16. python macd底背离_MACD的“底背离”狠不狠?回测告诉你结果
  17. webpack中对CSS压缩
  18. Excel批量调整图片大小适应单元格且整齐排列
  19. 第一个iOS应用 —— Hello world!
  20. C++ 关于protected

热门文章

  1. [日推荐] 『TheGolfGame』-小程序有游戏啦?
  2. 服务器设置文件夹权限代码,服务器设置文件夹权限
  3. 【Moasure魔尺】看看那些第一批“吃螃蟹”的设计师 如是说
  4. matlab矩阵行位列维,Matlab—基本操作与矩阵输入
  5. Google的云计算
  6. c语言程序设计:现代方法 勘误,C语言程序设计基础教程----勘误记录
  7. 导出excel时,数字过长怎么解决
  8. 排列组合 【插空法】【捆绑法】【容斥原理】
  9. 电脑音频服务器未修复咋办,音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...
  10. 名悦集团:暴雨过后车辆如何保养?