#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20 /*最多顶点个数*/
#define Error -1
#define OK 1
/*=====================================邻接矩阵表示法的c语言描述=================================================*/
typedef enum{DG, DN,UDG,UDN}GraphKind;/*图的种类: DG表示有向图, DN表示有向网, UDG表示无向图, UDN表示无向网*/
/*边的定义*/
typedef int AdjType; /*权值类型*/
typedef struct {
AdjType adj; /*对于无权图,用1或0表示是否相邻,对带权图,则为权值类型*/
//OtherInfo info; /*边存储的其它信息,因为此处无使用,故进行注释处理*/
} ArcNode;
/*图(邻接矩阵)的定义*/
typedef char VertexData;
typedef struct{
GraphKind kind; /*图的种类标志*/
int vexnum, arcnum; /*图的顶点数和弧数*/
VertexData vertex[MAX_VERTEX_NUM]; /*顶点向量*/
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];/*邻接矩阵*/
}AdjMatrix;
/*=====================================图(邻接矩阵表示法)的基本操作=================================================*/
/*算法7-1中需调用的LocateVex函数*/
int LocateVex(AdjMatrix *G, VertexData v)
{
int j=Error, k;
for(k=0; k<G->vexnum; k++)
if(G->vertex[k]==v)
{
j=k;
break;
}
return j;
}
//算法7-1:输入n个顶点和e条边的信息,创建赋权有向图G的邻接矩阵
void CreateDN(AdjMatrix *G)
{
int i, j, k;
AdjType weight;
VertexData v1, v2;
printf("请输入图的顶点数目:");
scanf("%d", &G->vexnum );
printf("请输入弧的数目:");
scanf("%d", &G->arcnum );
/*初始化邻接矩阵*/
for(i=0; i<G->vexnum; i++)
for(j=0; j<G->vexnum; j++)
G->arcs[i][j].adj=INFINITY;
printf("请输入顶点信息(直接连续输入,不要使用空格或回车间隔,除非空格或回车是顶点存储的元素):");
fflush(stdin); /*消除前面回车的影响*/
for(i=0; i<G->vexnum; i++)
scanf("%c", &G->vertex[i]);
printf("构建邻接矩阵,请输入一条弧的起点、终点与权值,例如\"a,b,10\"\n");
for(k=0; k<G->arcnum; k++)
{
printf("第%d-%d条:", G->arcnum, k+1);
fflush(stdin);
scanf("%c,%c,%d", &v1, &v2, &weight);
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G->arcs[i][j].adj=weight;
G->arcs[j][i].adj = weight;
}
}
void main()
{
AdjMatrix G;
G.kind=DN;
CreateDN(&G); /*创建赋权有向图*/
int i, j;
printf("输出图的顶点:\n");
for(i=0; i<G.vexnum; i++)
printf("%c", G.vertex[i]);
printf("\n");
printf("输出图的邻接矩阵:\n");
for(i=0; i<G.vexnum; i++)
{ for(j=0; j<G.vexnum; j++)
printf("%14d", G.arcs[i][j].adj);
printf("\n");
}
}