【C语言数据结构】图-邻接矩阵法

news/2024/12/2 13:40:45/

图-邻接矩阵法

  • 代码实现


代码实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>//定义最大顶点数为100,也就是这个图里最多有100个顶点
#define MaxVertexNum 100//给顶点类型设置为char(其实本质是给char取了个别名叫VertexType),也就是说顶点为'A'点,'B'点等。
typedef char VertexType;//同理,给边的类型设置为int,其实对于邻接矩阵法来说,边为1代表有连接,边为0代表无连接。
typedef int EdgeType;typedef struct {//建立一个一维数组,存储对应的顶点,也就是G=(V,E)中的VVertexType Vertex[MaxVertexNum];//建立一个二维数组,存储对应的边的集合,也就是G=(V,E)中的EEdgeType Edge[MaxVertexNum][MaxVertexNum];//定义顶点的数量和边的数量(英文中arc有弧的意思,这里指边)int vexnum, arcnum;
} MGraph;void FindVertex(MGraph *G, VertexType x, VertexType y, int *index_x, int *index_y);//初始化邻接矩阵的图
void InitGraph(MGraph *G) {G->vexnum = 0;G->arcnum = 0;
}//添加顶点
bool InsertVertex(MGraph *G, VertexType vertex) {//如果顶点已满,添加失败if (G->vexnum >= MaxVertexNum)return false;G->Vertex[G->vexnum] = vertex;G->vexnum++;return true;
}//判断是否有边(x,y)或<x,y>
void FindVertex(MGraph *G, VertexType x, VertexType y, int *index_x, int *index_y) {(*index_x) = -1;(*index_y) = -1;//定义x顶点和y顶点的索引
//遍历赋值,找出x和y的索引for (int i = 0; i < (*G).vexnum; i++) {if ((*G).Vertex[i] == x)(*index_x) = i;else if ((*G).Vertex[i] == y)(*index_y) = i;if ((*index_x) != -1 && (*index_y) != -1)break;}
}bool Adjacent(MGraph G, VertexType x, VertexType y) {int index_x;int index_y;FindVertex(&G, x, y, &index_x, &index_y);//如果有索引未找到,那么就说明不存在边(或者说其中某个点不存在)if (index_x == -1 || index_y == -1)return false;//如果有边,那么edge就为1return G.Edge[index_x][index_y] == 1;
}/*懒得写了,就简单的写一下构建图有关的函数就行了,以下函数先欠着,有时间再写:Neighbors(G,x)InsertVertex(G,x)DeleteVertex(G,x)AddEdge(G,x,y)RemoveEdge(G,x,y)FirstNeighbor(G,x)NextNeighbor(G,x,y)Get_edge_value(G,x,y)Set_edge_value(G,x,y,v)
*///创建边(无向图)
bool AddEdgeU(MGraph *G, VertexType x, VertexType y) {//先判断顶点是否存在int index_x;int index_y;FindVertex(G, x, y, &index_x, &index_y);//如果有索引未找到,那么就说明不存在某个顶点if (index_x == -1 || index_y == -1)return false;G->Edge[index_x][index_y] = 1;G->Edge[index_y][index_x] = 1;return true;
}//创建边(有向图)
bool AddEdgeD(MGraph *G, VertexType x, VertexType y) {//先判断顶点是否存在int index_x;int index_y;FindVertex(G, x, y, &index_x, &index_y);//如果有索引未找到,那么就说明不存在某个顶点if (index_x == -1 || index_y == -1)return false;G->Edge[index_x][index_y] = 1;return true;
}//打印矩阵
bool PrintGraph(MGraph G) {printf("\t");for(int i = 0;i<G.vexnum;i++)printf("%c\t",G.Vertex[i]);printf("\n");for (int i = 0; i < G.vexnum; i++) {printf("%c\t",G.Vertex[i]);for (int j = 0; j < G.vexnum; j++)printf("%d\t", G.Edge[i][j]);printf("\n");}
}int main() {//创建图MGraph G;//初始化图InitGraph(&G);//插入顶点InsertVertex(&G, 'A');InsertVertex(&G, 'B');InsertVertex(&G, 'C');InsertVertex(&G, 'D');InsertVertex(&G, 'E');//插入边AddEdgeU(&G, 'A', 'B');AddEdgeU(&G, 'A', 'C');AddEdgeU(&G, 'B', 'D');AddEdgeU(&G, 'C', 'D');AddEdgeU(&G, 'C', 'E');AddEdgeU(&G, 'D', 'E');//打印图邻接矩阵PrintGraph(G);//判断是否存在A-B边if(!Adjacent(G,'A','B'))printf("不存在A-B边!\n");else{printf("存在A-B边!\n");}return 0;
}

http://www.ppmy.cn/news/1149931.html

相关文章

OCP Java17 SE Developers 复习题04

答案 F. Line 5 does not compile. This question is checking to see whether you are paying attention to the types. numFish is an int, and 1 is an int. Therefore, we use numeric addition and get 5. The problem is that we cant store an int in a String variab…

【数学】Monocarp and the Set—CF1886D

Monocarp and the Set—CF1886D 参考文章 思路 我们把添加数字的过程倒过来看&#xff0c;也就是对长度为 n n n 的数组一个一个删除数字。那么 ′ > ′ > ′>′、 ′ < ′ < ′<′、 ′ ? ′ ? ′?′ 就分别代表“删除最大的数字”、“删除最小的数字…

Leetcode.2867 统计树中的合法路径数目

题目链接 Leetcode.2867 统计树中的合法路径数目 rating : 2428 题目描述 给你一棵 n n n 个节点的无向树&#xff0c;节点编号为 1 1 1 到 n n n 。给你一个整数 n n n 和一个长度为 n − 1 n - 1 n−1 的二维整数数组 e d g e s edges edges &#xff0c;其中 e d g …

同创永益成为英迈首家签约生态伙伴

日前&#xff0c;同创永益已和英迈签署生态运营战略协议&#xff0c;并正式成为英迈全新打造的GTM生态圈的首位签约合作伙伴。双方将携手对“同创数字韧性平台”产品进行一站式联合解决方案的持续整合&#xff0c;并将大力推动该联合解决方案在市场上的进一步拓展。 云原生时代…

在服务器上解压.7z文件

1. 更新apt sudo apt-get update2. 安装p7zip sudo apt-get install p7zip-full3. 解压.7z文件 7za x WN18RR.7z

免费使用Salesforce Data Cloud!详细操作步骤来啦

Data Cloud是Salesforce向市场推出的增长最快的产品&#xff0c;这对Salesforce来说是一个重要竞争优势。 近期&#xff0c;Salesforce宣布客户可以免费使用Data Cloud。这就是所谓的零美元SKU&#xff0c;换句话说&#xff0c;这是一条不会产生任何成本的Salesforce产品线。 …

AI人工智能入门之图像识别

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门涵盖多个领域的科学技术&#xff0c;旨在使计算机能够模拟人类智能。 其中一个热门的应用领域就是图像识别。 图像识别是指计算机通过对一幅图像进行分析和处理&#xff0c;来识别和理解图像…

springboot中自定义过滤器用Component注解不用Configuration注解的坏处是什么

在Spring Boot中&#xff0c;如果你使用Component注解来标记自定义过滤器类而不使用Configuration注解&#xff0c;可能会有以下一些潜在的问题和限制&#xff1a; 过滤器顺序问题&#xff1a;使用Component注解标记的类是被自动扫描并创建为Bean的&#xff0c;它们的注册顺序…