图的结构体定义:
typedef ElemType AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//顶点之间关系图
typedef struct
{
TElemType vexs[MAX_VERTEX_NUM];//顶点元素存储
AdjMatrix arcs;//顶点之间关系图
int vexnum, arcnum;//顶点个数和边或弧的数目
GraphKind kind;//图的种类
}MGraph;
判断应该实现哪种图/网的邻接矩阵:
Status CreateGraph(MGraph &G)
{
cout << "please input the kind of graph" << endl;
cin >> (int&)G.kind;
switch (G.kind)
{
case DG:return CreateDG(G, PrintG);//构造有向图
case DN:return CreateDN(G, PrintN);//构造有向网
case UDG:return CreateUDG(G, PrintG);//构造无向图
case UDN:return CreateUDN(G,PrintN);//构造无向网
default:return ERROR;
}
}
构造有向图并输出邻接矩阵:
Status CreateDG(MGraph &G, Status(*visit)(MGraph))
{
TElemType v1, v2;
cout << "读入定点数和边数目:" << endl;
cin >> G.vexnum >> G.arcnum;//读入定点数和边数目
cout << "输入顶点元素:" << endl;
for (int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i];//构造顶点向量
for (int i = 0; i < G.vexnum; i++)
for (int j = 0; j < G.vexnum; j++)
G.arcs[i][j] = 0;//邻接矩阵初始化
cout << "构造顶点之间关系:" << endl;
for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
cin >> v1 >> v2;//读入一条边依附的顶点和权值
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);//确定v1,v2在图中的位置
G.arcs[i][j] = 1;//边 <v1,v2>的权值
}
visit(G);
return OK;
}
构造无向图并输出邻接矩阵:
Status CreateUDG(MGraph &G,Status (*visit)(MGraph))
{
TElemType v1, v2;
cout << "读入定点数和边数目:" << endl;
cin >> G.vexnum >> G.arcnum;//读入定点数和边数目
cout << "输入顶点元素:" << endl;
for (int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i];//构造顶点向量
for (int i = 0; i < G.vexnum; i++)
for (int j = 0; j < G.vexnum; j++)
G.arcs[i][j] = 0;//邻接矩阵初始化
cout << "构造顶点之间关系:" << endl;
for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
cin >> v1 >> v2;//读入一条边依附的顶点和权值
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);//确定v1,v2在图中的位置
G.arcs[i][j] = 1;//边 <v1,v2>的权值
G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>
}
visit(G);
return OK;
}
构造有向网并输出邻接矩阵:
Status CreateDN(MGraph &G,Status (* visit)(MGraph))
{
TElemType v1, v2;
ElemType e;
cout << "读入定点数和边数目:" << endl;
cin >> G.vexnum >> G.arcnum;//读入定点数和边数目
cout << "输入顶点元素:" << endl;
for (int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i];//构造顶点向量
for (int i = 0; i < G.vexnum; i++)
for (int j = 0; j < G.vexnum; j++)
G.arcs[i][j] = INFINITY;//邻接矩阵初始化
cout << "构造顶点之间关系:" << endl;
for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
cin >> v1 >> v2 >> e;//读入一条边依附的顶点和权值
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);//确定v1,v2在图中的位置
G.arcs[i][j] = e;//边 <v1,v2>的权值
}
visit(G);
return OK;
}
构造无向网并输出邻接矩阵:
Status CreateUDN(MGraph &G, Status(*visit)(MGraph))
{
TElemType v1, v2;
ElemType e;
cout << "读入定点数和边数目:" << endl;
cin >> G.vexnum >> G.arcnum;//读入定点数和边数目
cout << "输入顶点元素:" << endl;
for (int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i];//构造顶点向量
for (int i = 0; i < G.vexnum; i++)
for (int j = 0; j < G.vexnum; j++)
G.arcs[i][j] = INFINITY;//邻接矩阵初始化
cout << "构造顶点之间关系:" << endl;
for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
cin >> v1 >> v2 >>e;//读入一条边依附的顶点和权值
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);//确定v1,v2在图中的位置
G.arcs[i][j] = e;//边 <v1,v2>的权值
G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>
}
visit(G);
return OK;
}
确定顶点关系输入元素时元素所对应的顶点序列号:
int LocateVex(MGraph G, TElemType e)
{
for (int i = 0; i < G.vexnum; i++)
if (G.vexs[i] == e)//如果元素为该顶点元素,输出该结点序列号
return i;
}
调用输出邻接矩阵函数:
Status PrintVexs(TElemType t)//返回顶点元素
{
cout << t << " ";
return OK;
}
Status PrintArcs(ElemType e)//返回邻接矩阵元素
{
cout << e << " ";
return OK;
}
Status PrintMGraph(MGraph G)//打印网的邻接矩阵
{
for (int i = 0; i <= G.vexnum; i++)
{
for (int j = 0; j <= G.vexnum; j++)
{
if (i == 0 && j == 0)//左上角输出为空
cout << " ";
else if (i == 0)//第一行输出顶点元素
PrintVexs(G.vexs[j - 1]);
else if (j == 0)//第一列输出顶点元素
PrintVexs(G.vexs[i - 1]);
else
if (G.arcs[i - 1][j - 1] != (int)INFINITY)//如果不为INFINITY,输出邻接矩阵元素
PrintArcs(G.arcs[i - 1][j - 1]);
else
cout << INFINITY << " ";
}
cout << endl;
}
return OK;
}
Status PrintG(MGraph G)//打印图的邻接矩阵
{
for (int i = 0; i <= G.vexnum; i++)
{
for (int j = 0; j <= G.vexnum; j++)
{
if (i == 0 && j == 0)
cout << " ";
else if (i == 0)
PrintVexs(G.vexs[j - 1]);
else if (j == 0)
PrintVexs(G.vexs[i - 1]);
else
PrintArcs(G.arcs[i - 1][j - 1]);
}
cout << endl;
}
return OK;
}
main.cpp:
int main()
{
MGraph G;
for (int i = 0; i < 4; i++)
{
menu();
CreateGraph(G);
char ch;
cout << "please enter a char to continue" << endl;
cin >> ch;
system("cls");
}
system("pause");
return 0;
}
调试结果: