鄰接矩陣(無向網圖)- 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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM