优化这段代码,使其能够存储带权值的图
时间: 2024-03-06 16:47:10 浏览: 118
下面是对原来代码的优化,实现带权值的图存储:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 20
typedef int VexType;
typedef int WeightType;
typedef struct {
VexType v1, v2;
WeightType weight;
} Edge;
typedef struct {
VexType vex[MAX];
WeightType arc[MAX][MAX];
int n, e;
} Graph;
/* 函数原型声明 */
void creat_graph(Graph *g);
void out_graph(Graph *g);
/* 主函数 */
int main() {
Graph g;
creat_graph(&g);
out_graph(&g);
return 0;
}
/* 建立带权图 */
void creat_graph(Graph *g) {
int i, j, k;
printf("\n n,e=?");
scanf("%d%d", &(g->n), &(g->e)); /* 输入顶点数n,边数e */
for (i = 1; i <= g->n; i++)
for (j = 1; j <= g->n; j++)
g->arc[i][j] = -1; /* 初始化为-1表示不连通 */
for (k = 1; k <= g->e; k++) { /* 组织边数的循环 */
printf("\n vi,vj,w=?");
scanf("%d%d%d", &(g->vex[k].v1), &(g->vex[k].v2), &(g->vex[k].weight)); /* 输入一条边的两个顶点编号i,j和权值w */
g->arc[g->vex[k].v1][g->vex[k].v2] = g->vex[k].weight;
g->arc[g->vex[k].v2][g->vex[k].v1] = g->vex[k].weight; /* 无向图的邻接矩阵是对称矩阵 */
}
}
/* 简单输出带权图,为了检查输入是否正确 */
void out_graph(Graph *g) {
int i, j, k;
char ch;
for (i = 1; i <= g->n; i++) { /* 矩阵原样输出 */
printf("\n ");
for (j = 1; j <= g->n; j++)
printf("%5d", g->arc[i][j]);
}
/* 输出所存在的边 */
for (k = 1; k <= g->e; k++)
printf("\n 存在边< %d,%d >,权值为%d", g->vex[k].v1, g->vex[k].v2, g->vex[k].weight);
printf("\n\n 打回车键,继续。");
ch = getch();
}
```
这里采用了结构体和二维数组相结合的方式,将图的信息存储在Graph结构体中。其中,vex数组用来存储每条边的信息,arc数组用来存储邻接矩阵,初始化为-1表示不连通,有边的位置存储边的权值。在creat_graph函数中,输入每条边的信息,并将邻接矩阵中对应位置赋值为边的权值。在out_graph函数中,输出邻接矩阵和存在的边的信息。
阅读全文