邻接矩阵(无向网图)- C语言
方式一【大话数据结构】:
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
#define INFINITY 65535
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */
typedef struct
{
VertexType vexs[MAXVEX]; /* 顶点表 */
EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
int numNodes, numEdges; /* 图中当前的顶点数和边数 */
}MGraph;
/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph* G)
{
int i, j, k, w;
printf("输入顶点数和边数:\n");
scanf_s("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */
for (i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */
scanf_s(&G->vexs[i]);
for (i = 0; i < G->numNodes; i++)
for (j = 0; j < G->numNodes; j++)
G->arc[i][j] = INFINITY; /* 邻接矩阵初始化 */
for (k = 0; k < G->numEdges; k++) /* 读入numEdges条边,建立邻接矩阵 */
{
printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
scanf_s("%d,%d,%d", &i, &j, &w); /* 输入边(vi,vj)上的权w */
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j]; /* 因为是无向图,矩阵对称 */
}
}
void TraverseGraph(MGraph* G)
{
for (int i = 0; i < G->numNodes; i++)
{
printf("[");
for (int j = 0; j < G->numNodes; j++)
{
printf(" %d ", G->arc[i][j]);
}
printf("]\n");
}
}
// 输入顶点数和边数:
// 4, 5
// 输入边(vi, vj)上的下标i,下标j和权w :
// 0, 1, 1
// 输入边(vi, vj)上的下标i,下标j和权w :
// 0, 2, 1
// 输入边(vi, vj)上的下标i,下标j和权w :
// 0, 3, 1
// 输入边(vi, vj)上的下标i,下标j和权w :
// 1, 2, 1
// 输入边(vi, vj)上的下标i,下标j和权w :
// 2, 3, 1
// [65535 1 1 1 ]
// [1 65535 1 65535 ]
// [1 1 65535 1 ]
// [1 65535 1 65535 ]
int main(void)
{
MGraph G;
CreateMGraph(&G);
TraverseGraph(&G);
return 0;
}
方式二:
// 邻接矩阵
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MaxVertexNum 100 // 最大顶点数设为100
#define INFINITY 65535 // ∞设为双字节无符号整数的最大值
typedef int Vertex; // 顶点下标(用顶点下标表示顶点)
typedef int WeightType; // 边的权值设为整型
typedef char DataType; // 顶点存储的数据类型设为整型
typedef struct GNode* PtrToGNode; // 图结点
struct GNode {
int Nv; // 顶点数
int Ne; // 边数
WeightType G[MaxVertexNum][MaxVertexNum]; // 邻接矩阵
DataType Data[MaxVertexNum]; // 顶点数据,如果顶点无数据,则可以不必定义此变量
};
typedef PtrToGNode MGraph; // 以邻接矩阵存储的图类型
typedef struct ENode* PtrToENode; // 边指针的定义
struct ENode { // 边的结构的定义
Vertex V1, V2; // 有向边<V1, V2>
WeightType Weight; // 权重
};
typedef PtrToENode Edge; // 边的定义(边的指针的别名)
MGraph CreateGraph(int VertexNum)
{
// 初始化一个有VertexNum个顶点,但没有边的图
Vertex V, W; // 表示顶点下标的临时变量
MGraph Graph;
Graph = (MGraph)malloc(sizeof(struct GNode)); // 创建图
Graph->Nv = VertexNum;
Graph->Ne = 0;
// 使用INFINITY初始化图的邻接矩阵的每个坐标点
// 邻接矩阵坐标编号:0 --- (Graph->Nv - 1)
for (V = 0; V < Graph->Nv; V++)
{
for (W = 0; W < Graph->Nv; W++)
{
Graph->G[V][W] = INFINITY;
}
}
return Graph;
}
// 插入边 - 本质上是针对邻接矩阵表示的边赋权
void InsertEdge(MGraph Graph, Edge E)
{
// 邻接矩阵为对称矩阵
Graph->G[E->V1][E->V2] = E->Weight;
// 如果是无向网图,邻接矩阵为对称矩阵
Graph->G[E->V2][E->V1] = E->Weight;
}
MGraph BuildGraph()
{
MGraph Graph;
Edge E;
Vertex V;
int Nv, i;
printf("输入顶点个数\n");
scanf_s("%d", &Nv); // 读入顶点个数
Graph = CreateGraph(Nv); // 初始化有Nv个顶点但没有边的图
printf("输入边数\n");
scanf_s("%d", &(Graph->Ne)); // 读入边数
if (Graph->Ne != 0) {
E = (Edge)malloc(sizeof(struct ENode));
for (i = 0; i < Graph->Ne; i++)
{
printf("输入边(V1, V2, Weight):\n");
scanf_s("%d,%d,%d", &E->V1, &E->V2, &E->Weight); // 通过输入创建一条边
InsertEdge(Graph, E); // 将边插入图中
}
}
for (V = 0; V < Graph->Nv; V++)
{
printf("输入顶点:\n");
scanf_s(" %c", &(Graph->Data[V])); // 输入各顶点的数据
printf("输入顶点值:%d\n", Graph->Data[V]);
}
return Graph;
}
void TraverseGraph(MGraph G)
{
printf("顶点数:\n", G->Nv);
for (int i = 0; i < G->Nv; i++)
{
printf("[");
for (int j = 0; j < G->Nv; j++)
{
printf(" %d(%c, %c) ", G->G[i][j], G->Data[i], G->Data[j]);
}
printf("]\n");
}
}
// 输入顶点个数
// 4
// 输入边数
// 5
// 输入边(V1, V2, Weight) :
// 0, 1, 12
// 输入边(V1, V2, Weight) :
// 0, 2, 23
// 输入边(V1, V2, Weight) :
// 0, 3, 12
// 输入边(V1, V2, Weight) :
// 1, 2, 53
// 输入边(V1, V2, Weight) :
// 2, 3, 98
// 输入顶点 :
// a
// 输入顶点值 : 97
// 输入顶点 :
// b
// 输入顶点值 : 98
// 输入顶点 :
// c
// 输入顶点值 : 99
// 输入顶点 :
// d
// 输入顶点值 : 100
// 顶点数 :
// [65535(a, a) 12(a, b) 23(a, c) 12(a, d)]
// [12(b, a) 65535(b, b) 53(b, c) 65535(b, d)]
// [23(c, a) 53(c, b) 65535(c, c) 98(c, d)]
// [12(d, a) 65535(d, b) 98(d, c) 65535(d, d)]
int main()
{
MGraph Graph = BuildGraph();
TraverseGraph(Graph);
return 0;
}