1.变量声明和定义
#define OK 1
#define ERROR -1
#define MAX_VERTEX_NUM 20 //顶点个数最大值为20
#define INFINITY INT_MAX //权值的最大值∞
typedef int ArcType; //顶点之间的关系(弧的类型)为整型
typedef char VertexType; //顶点数据类型为字符型
typedef int Status;
typedef enum{DG,DN,UDG,UDN} Graphkind //图的类型,分为{有向图,有向网,无向图,无向网}
2.邻接矩阵存储结构
/*-------------------零阶矩阵存储结构---------------*/
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量,存储所有顶点的信息
ArcType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵n*n,存储各个顶点之间边的信息
int vexnum; //顶点总数n
int arcnum; //弧(边)总数e
}MGraph;
3.邻接矩阵构造图(网)
邻接矩阵无向网的构造方法:
①先输入总顶点数n和边数e;
②依次输入n个顶点的信息,并存入顶点表的一维数组中
③初始化邻接矩阵,每个边的权值初始化为∞或0
④构造邻接矩阵,对有边的顶点间设置权值
1.无向网转换成有向网,只需要对单一方向的弧进行一次权值赋值
2.无向网转换成无向图,只需要在初始化时令所有顶点之间弧为0,
对顶点间存在弧时对弧赋值为1,其余不变。
3.无向图转换成有向图,则为1和2的总和
/*---------------无向网的构造,用邻接矩阵表示------------*/
Status CreateUDN(MGraph &G)
{
int i,j,k,w;
VertexType v1,v2; //初始点v1,终端点v2
printf("输入顶点数n:");
scanf("%d",&G.vexnum); //输入总顶点数n
printf("\n");
printf("输入弧的总数e:");
scanf("%d",&G.arcnum); //输入总弧数e
printf("\n");
getchar();
printf("依次输入%d个顶点信息:\n",G.vexnum);
for(i=0;i<G.vexnum;++i)
scanf("%c",&G.vexs[i]); //输入n个顶点值,存入一维向量
for(i=0;i<G.vexnum;++i) //对邻接矩阵n*n个单元初始化,对各边赋权值为∞
{
for(j=0;j<G.vexnum;++j) G.arcs[i][j]=INFINITY;
}
for(k=0;k<G.arcnum;++k) //给邻接矩阵有关单元赋初值(循环次数=边数e)
{
getchar();
printf("输入初始顶点v1:");
scanf("%c",&v1);
getchar();
printf("请输入终端顶点v2:");
scanf("%c",&v2);
getchar();
printf("输入%c到%c弧的权值w:",v1,v2);
scanf("%d",&w);
printf("\n");
i=LocateVex(G,v1);
j=LocateVex(G,v2); //找到两顶点在矩阵中的位置(n次)
G.arcs[i][j]=w; //输入对应权值
G.arcs[j][i]=G.arcs[i][j]; //无向网是对称矩阵
}
return OK;
}