邻接矩阵(无向网图)- 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;
}
posted @ 2020-09-28 17:27  墨狮  阅读(1916)  评论(0编辑  收藏  举报