邻接矩阵 建图
程序员文章站
2023-12-23 19:51:45
...
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define INFINITY 65535
// 邻接矩阵 建图
// 一个一维数组 存储顶点信息
// 一个二维数组 存储边及其权重信息
// 带权重的 数组 自身到自身不存在设置为 0
// 其它有边存在设置为 相应权重
// 剩下 无边的 设置为 无穷大 (INFINITY)
//此处为建立无向图
typedef int EdgeType; //权重 类型
typedef char VertexType;// 顶点类型
typedef struct GNode* MGraph;
struct GNode{
VertexType Vex[MAXVEX]; // 节点
EdgeType Edge[MAXVEX][MAXVEX];
};
MGraph Initialize(MGraph G, int v) // 图初始化
{
int i, j;
for(i = 0; i < v; i++ ){
for(j = 0; j < v; j++ ){
if(i == j){
G->Edge[i][j] = 0;// 不存在自己到自己的边
}
else{
G->Edge[i][j] = INFINITY;
}
}
}
}
MGraph CreateGraph(int Vnum)
{
MGraph G = (MGraph)malloc(sizeof(struct GNode));
if(G == NULL){
printf("Error");
return NULL;
}
int Enum, v, e;
Initialize(G, Vnum);
printf("请输入顶点信息 : \n");
for(v = 0; v < Vnum; v++ ){
scanf("%c",&G->Vex[v]); // 字符间不要有空格
}
int k;
printf("请输入边数:\n");
fflush(stdin); //防止 上面读取信息 错误
scanf("%d",&Enum);
printf("请输入各边及其权值 :\n");
int i, j, w; //(i, j)代表边 w代表权重
for(e = 0; e < Enum; e++ ){
scanf("%d %d %d",&i, &j, &w);//中间 空格
G->Edge[i][j] = w;
G->Edge[j][i] = G->Edge[i][j]; //无向图 对称性
}
return G;
}
void Print(MGraph G, int Vnum)//打印邻接矩阵
{
int i, j;
for(i = 0; i < Vnum; i++ ){
for(j = 0; j < Vnum; j++ ){
if(i == j)
printf(" 0");
else if(G->Edge[i][j] == INFINITY){
printf(" #");
}
else{
printf("%2d",G->Edge[i][j]);
}
}
printf("\n");
}
}
int main()
{
MGraph G;
int Vnum;
printf("请输入顶点个数: \n");
scanf("%d",&Vnum);
G = CreateGraph(Vnum);
printf("建图结果:\n");
Print(G, Vnum);
return 0;
}