1 /********************************************************************************** 2 *Name: 邻接矩阵(无向网) 3 *Date: 2022.01.18 4 *Author: 吕辉 5 *Description: 图的邻接矩阵是表示顶点之间相邻关系的矩阵,是顺序存储结构, 6 * 因此也称为“数组表示法”。它采用两个数组分别来存储图的顶点 7 * 和边(弧)的信息。其中,用一个一维数组来存储顶点信息,一个二维 8 * 数组来存储边(弧)的信息。事实上,这里的邻接矩阵主要指的是这个 9 * 二维数组。---《数据结构与算法(王曙燕)》 10 ***********************************************************************************/ 11 #define _CRT_SECURE_NO_WARNINGS 12 #include <stdio.h> 13 #include <stdlib.h> 14 15 #define MAXVEX 20/*最大顶点个数*/ 16 #define INFINITY 32767/*表示极大值∞*/ 17 typedef struct 18 { 19 int arcs[MAXVEX][MAXVEX];/*边(弧)信息*/ 20 char vex[MAXVEX];/*顶点信息,这里顶点类型设置为字符型*/ 21 int vexnum;/*顶点数目*/ 22 int arcnum;/*边(弧)数目*/ 23 }AdjMatrix;/*邻接矩阵(Adjacency Matrix)*/ 24 25 void Create(AdjMatrix* G); 26 int LocateVex(AdjMatrix* G, char vex); 27 void Print(AdjMatrix* G); 28 29 int main(void) 30 { 31 AdjMatrix G; 32 Create(&G); 33 Print(&G); 34 system("pause"); 35 return 0; 36 } 37 /*************************************************** 38 * Function: Create 39 * Description: 用邻接矩阵创建无向网 40 * Called By: main 41 * Call: LocateVex 42 * Parameter : G 图 43 ****************************************************/ 44 void Create(AdjMatrix* G) 45 { 46 int i = 1; 47 int j = 1; 48 int k = 1; 49 int weight = 0; 50 char vex1 = '\0'; 51 char vex2 = '\0'; 52 53 printf("请输入无向网中的顶点数和边数(逗号分隔):\n"); 54 scanf("%d%*c%d", &G->vexnum, &G->arcnum); 55 for (i = 1; i <= G->vexnum; i++) 56 { 57 for (j = 1; j <= G->vexnum; j++) 58 { 59 G->arcs[i][j] = INFINITY; 60 } 61 } 62 printf("请输入无向网中%d个结点:\n", G->vexnum); 63 for (i = 1; i <= G->vexnum; i++) 64 { 65 printf("第%d个顶点:", i); 66 scanf(" %c", &G->vex[i]);/*%c前均有一个空格,用于吸收缓冲区的空白字符*/ 67 } 68 printf("请输入无向网中%d条边:\n", G->vexnum); 69 for (k = 1; k <= G->arcnum; k++) 70 { 71 printf("从顶点:"); 72 scanf(" %c", &vex1); 73 printf("到顶点:"); 74 scanf(" %c", &vex2); 75 printf("权值为:"); 76 scanf("%d", &weight); 77 i = LocateVex(G, vex1); 78 j = LocateVex(G, vex2); 79 G->arcs[i][j] = weight; 80 G->arcs[j][i] = weight; 81 } 82 } 83 /************************************************************* 84 * Function: LocateVex 85 * Description: 返回输入顶点在顶点数组中的位置 86 * Called By: Create 87 * Parameter : G 图 88 * vex 顶点 89 * Return: 若G中存在顶点vex,则返回该顶点在顶点数组中下标 90 * 否则返回 0 91 **************************************************************/ 92 int LocateVex(AdjMatrix* G, char vex) 93 { 94 int i = 1; 95 for (i = 1; i <= G->vexnum; i++) 96 { 97 if (G->vex[i] == vex) 98 { 99 return i; 100 } 101 } 102 return 0; 103 } 104 /************************************************************* 105 * Function: Print 106 * Description: 打印邻接矩阵 107 * Called By: main 108 * Parameter : G 图 109 **************************************************************/ 110 void Print(AdjMatrix* G) 111 { 112 int i = 1; 113 int j = 1; 114 printf("邻接矩阵为:\n"); 115 for (i = 1; i <= G->vexnum; i++) 116 { 117 for (j = 1; j <= G->vexnum; j++) 118 { 119 printf("%d\t", G->arcs[i][j]); 120 } 121 printf("\n"); 122 } 123 }