方式一【大話數據結構】:
#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;
}
