邻接矩阵表示图的数据类型遍历
#define MAX_VERTEX 100 //最大顶点数
#define MAX_WEIGHT 99999 //最大权值
typedef char VerType; //顶点类型
typedef int EdgeType; //边类型
struct AMGraph //Adjacency Matrix Graph--邻接矩阵表示图
{
VerType vers[MAX_VERTEX]; //顶点表
EdgeType edges[MAX_VERTEX][MAX_VERTEX]; //邻接矩阵
int vernum, edgenum; //图的当前顶点数和边数
};
由顶点值查找顶点下标
int LocateVer(const AMGraph& G, VerType u) { //由顶点值查找顶点下标
for (int i = 0; i < G.vernum; ++i) {
if (G.vers[i] == u)
return i;
}
return -1;
}
创建无向有权图
int Create_unAMGraph_weight(AMGraph& G) { //创建无向有权图
cout << "请输入图的顶点数和边数:" << endl;
cin >> G.vernum >> G.edgenum;
for (int i = 0; i < G.vernum; ++i) {
cout << "请输入顶点的信息:" << endl;
cin >> G.vers[i];
}
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
G.edges[i][j] = MAX_WEIGHT; //边的权值初始化为最大值
}
}
VerType v1, v2;
int i, j;
int weight;
for (int k = 0; k < G.edgenum; ++k) {
cout << "请输入要添加边的顶点信息和权值:" << endl;
cin >> v1 >> v2 >> weight;
i = LocateVer(G, v1);
j = LocateVer(G, v2);
G.edges[i][j] = G.edges[j][i] = weight;
}
return OK;
}
创建有向无权图
int Create_AMGraph_weight(AMGraph& G) { //创建有向无权图
cout << "输入图的顶点数和边数" << endl;
cin >> G.vernum >> G.edgenum;
for (int i = 0; i < G.vernum; ++i) {
cout << "请输入顶点的信息:" << endl;
cin >> G.vers[i];
}
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
G.edges[i][j] = 0;
}
}
int i, j;
VerType v1, v2;
for (int k = 0; k < G.edgenum; ++k) {
cout << "输入添加边所依赖的两个顶点(前指向后):" << endl;
cin >> v1 >> v2;
i = LocateVer(G, v1);
j = LocateVer(G, v2);
G.edges[i][j] = 1; //有向图不是对称矩阵
}
return OK;
}
展示邻接矩阵
void showGraph(const AMGraph& G) { //展示邻接矩阵
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
cout << G.edges[i][j] << " ";
}
cout << endl;
}
}
测试代码
int main() {
AMGraph G;
Create_unAMGraph_weight(G);
showGraph(G);
Create_AMGraph_weight(G);
showGraph(G);
system("pause");
return 0;
}
无向有权图
有向无权图
全部代码
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_VERTEX 100 //最大顶点数
#define MAX_WEIGHT 99999 //最大权值
typedef char VerType; //顶点类型
typedef int EdgeType; //边类型
struct AMGraph //Adjacency Matrix Graph--邻接矩阵表示图
{
VerType vers[MAX_VERTEX]; //顶点表
EdgeType edges[MAX_VERTEX][MAX_VERTEX]; //邻接矩阵
int vernum, edgenum; //图的当前顶点数和边数
};
int LocateVer(const AMGraph& G, VerType u) { //由顶点值查找顶点下标
for (int i = 0; i < G.vernum; ++i) {
if (G.vers[i] == u)
return i;
}
return -1;
}
int Create_unAMGraph_weight(AMGraph& G) { //创建无向有权图
cout << "请输入图的顶点数和边数:" << endl;
cin >> G.vernum >> G.edgenum;
for (int i = 0; i < G.vernum; ++i) {
cout << "请输入顶点的信息:" << endl;
cin >> G.vers[i];
}
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
G.edges[i][j] = MAX_WEIGHT; //边的权值初始化为最大值
}
}
VerType v1, v2;
int i, j;
int weight;
for (int k = 0; k < G.edgenum; ++k) {
cout << "请输入要添加边的顶点信息和权值:" << endl;
cin >> v1 >> v2 >> weight;
i = LocateVer(G, v1);
j = LocateVer(G, v2);
G.edges[i][j] = G.edges[j][i] = weight;
}
return OK;
}
int Create_AMGraph_weight(AMGraph& G) { //创建有向无权图
cout << "输入图的顶点数和边数" << endl;
cin >> G.vernum >> G.edgenum;
for (int i = 0; i < G.vernum; ++i) {
cout << "请输入顶点的信息:" << endl;
cin >> G.vers[i];
}
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
G.edges[i][j] = 0;
}
}
int i, j;
VerType v1, v2;
for (int k = 0; k < G.edgenum; ++k) {
cout << "输入添加边所依赖的两个顶点(前指向后):" << endl;
cin >> v1 >> v2;
i = LocateVer(G, v1);
j = LocateVer(G, v2);
G.edges[i][j] = 1; //有向图不是对称矩阵
}
return OK;
}
void showGraph(const AMGraph& G) { //展示邻接矩阵
for (int i = 0; i < G.vernum; ++i) {
for (int j = 0; j < G.vernum; ++j) {
cout << G.edges[i][j] << " ";
}
cout << endl;
}
}
int main() {
AMGraph G;
Create_unAMGraph_weight(G);
showGraph(G);
Create_AMGraph_weight(G);
showGraph(G);
system("pause");
return 0;
}