#include "stdio.h"
#include "stdlib.h"
#define MVN 20
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType Vexs[MVN];// 顶点数组
ArcType Arcs[MVN][MVN];// 边/弧
int Vexnum,Arcnum;// 当前顶点数和边数
}AMGraph;// Adjacency Matrix Graph :邻接矩阵
typedef struct
{
VerTexType Vex[MVN];
ArcType Arcs[MVN][MVN];
}InAMGraph; // Inverse Adjacency Matrix Grapg 逆邻接矩阵
int get_first(AMGraph* G,VerTexType* vex);
int GetVertex(AMGraph* G);
int LocateVex(AMGraph* G,VerTexType v);
int CreateDG(AMGraph* G, InAMGraph* IG)// Create Direction Graph 创建有向图
{ VerTexType v1;
VerTexType v2;//弧的两个顶点
printf("输入顶点的数量:\n");
scanf("%d",&(*G).Vexnum);// 指定顶点的数量
printf("输入边的数量:\n");
scanf("%d",&(*G).Arcnum);// 指定边的数量
for(int i = 0; i< (*G).Vexnum; i++)//对于图,初始化为0;对于网,初始化为无穷大
{
for(int j = 0; j < (*G).Vexnum; j++)
(*G).Arcs[i][j] = 0;
}
GetVertex(&(*G));
for (int k = 0; k < (*G).Arcnum; k++)// 数据写入矩阵
{ printf("从哪个顶点到哪个顶点?\n");
printf("弧尾:\n");
get_first(&(*G),&v1);
printf("弧头:\n");
get_first(&(*G),&v2);
int i = LocateVex(&(*G),v1);//行
int j = LocateVex(&(*G),v2);//列
(*G).Arcs[i][j] = 1;// 邻接矩阵
(*IG).Arcs[j][i] = 1;//逆邻接矩阵
}
return 1;
}
int GetVertex(AMGraph* G)
{
for (int i = 0; i <(*G).Vexnum; i++)// 逐个输入顶点的值
{ printf("输入顶点的值:\n");
get_first(&(*G),&(*G).Vexs[i]);// 写入到顶点数组
}
}
int LocateVex(AMGraph* G,VerTexType v)//查找顶点在顶点数组中的下标
{
if(sizeof(*G) == 0) return 0;
for(int i = 0; i < MVN; i++)
{
if((*G).Vexs[i] = v)
return i;
}
return 0;
}
int get_first(AMGraph* G, VerTexType* vex)//去除键盘输入换行符
{
(*vex) = getchar();
while(getchar() != '\n')
continue;
return 1;
}
int main()
{ InAMGraph IG;
AMGraph G;
CreateDG(&G,&IG);
return 0;
邻接矩阵&逆邻接矩阵
于 2022-09-14 17:11:59 首次发布