图的邻接矩阵表示实现

Posted on 2020-05-17 07:59  黑炽  阅读(347)  评论(0编辑  收藏  举报
 1 #include<stdio.h>
 2 #include "matrixGraph.cpp"
 3 
 4 int main(void) {
 5     MatrixGraph G;//定义保存邻接矩阵结构的图
 6     int i, j;
 7 
 8     printf("请输入生成图的类型(0.无向图, 1.有向图):");
 9     scanf("%d", &G.graphType);
10     printf("请输入图的定点数量和边的数量:");
11     scanf("%d %d", &G.vertexNum, &G.edgeNum);
12     for (i = 0; i < G.vertexNum; i++)
13         for (j = 0; j < G.edgeNum; j++)
14             G.edge[i][j] = maxValue;//设置矩阵中个元素的值为最大值
15     createMatrixGraph(&G);//创建邻接矩阵保存的图
16     printf("邻接矩阵数据如下:\n");
17     outMatrix(&G);
18     return 0;
19 }
20 
21 void createMatrixGraph(MatrixGraph* G) {
22     int i, j, k, weight;
23     char start, end;//一条边的两个顶点
24     printf("请输入各顶点信息:\n");
25     for (i = 0; i < G->vertexNum; i++) {
26         getchar();//读入回车,不然%c会读入
27         printf("第%d个顶点:", i + 1);
28         scanf("%c", &G->vertex[i]);
29     }
30 
31     printf("请输入构成各边的两个顶点及权值:\n");
32     for (k = 0; k < G->edgeNum; k++) {
33         getchar();//读入回车,不然%c会读入
34         printf("第%d条边:", k + 1);
35         scanf("%c %c %d", &start, &end, &weight);
36         for (i = 0; start != G->vertex[i]; i++);//在已有定点中查找始结点
37         for (j = 0; end != G->vertex[j]; j++);//查找末尾结点
38         G->edge[i][j] = weight;//对应位置保存权值,表示有一条边
39         if (!G->graphType) G->edge[j][i] = weight;//若是无向图,则邻接矩阵关于对角线位置,也应该有一条边
40     }
41 }
42 
43 void outMatrix(MatrixGraph* G) {
44     int i, j;
45 
46     for (i = 0; i < G->vertexNum; i++) printf("\t%c", G->vertex[i]);//在第一行输出顶点信息
47     printf("\n");
48     for (i = 0; i < G->vertexNum; i++) {
49         printf("%c", G->vertex[i]);
50         for (j = 0; j < G->vertexNum; j++) {
51             if (G->edge[i][j] == maxValue) printf("\t∞");
52             else printf("\t%d", G->edge[i][j]);//输出边的权值
53         }
54         printf("\n");
55     }
56 }

其中 "matrixGraph''文件内容如下

 1 #define vertex_max 26
 2 #define maxValue 32767
 3 typedef struct {
 4     char vertex[vertex_max];//储存定点信息
 5     int edge[vertex_max][vertex_max];//存储边的权的矩阵
 6     int isTrav[vertex_max];//遍历标志
 7     int vertexNum;//点的数目
 8     int edgeNum;//边的数目
 9     int graphType;//图的类型,0表示无向图,1表示有向图
10 }MatrixGraph;
11 
12 void createMatrixGraph(MatrixGraph* G);//创建邻接矩阵
13 void outMatrix(MatrixGraph* G);//输出邻接矩阵