#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<assert.h>
#define OK 1
#define ERROR 0
#define INFINITY -1 /* -1代表无穷 */
#define MAX_VERTEX_NUM 20 /* 最大顶点个数 */
typedef int VertexType; /* 向量的类型 */
typedef int InfoType; /* 弧相关信息指针类型 */
typedef int VRType; /* 结点关系值的类型 */
typedef enum {DG, DN, UDG, UDN} GraphKind; /* 有向图,有向网,无向图,无向网 */
typedef struct ArcCell /* 弧或边的结构体 */
{
VRType adj; /* VRType是顶点关系类型。对无权图,用 1 或者 0 */
/* 用来表示是否相邻;对带权图,则为权值类型。 */
InfoType *info; /* 该弧相关信息的指针 */
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM]; /* 顶点向量 */
AdjMatrix arcs; /* 邻接矩阵(保存数据的矩阵) */
int vexnum,arcnum; /* 图的当前顶点数和弧数 */
GraphKind kind; /* 图的类型标志 */
}MGraph;
#if 0
int CreateGraph(MGraph **G)
{
/*
** 采用数组(邻接矩阵)表示法,构造图G
*/
scanf("%d",&(*G)->kind);
switch((*G)->kind)
{
case DG:
return GreateDG(MGraph **G); /* 构造有向图 */
case DN:
return CreateDN(MGraph **G); /* 构造有向网 */
case UDG:
return CreateUDG(MGraph **G); /* 构造无向图 */
case UDN:
return CreateUDN(MGraph **G); /* 构造无向网 */
default:
return ERROR;
}
return OK;
}
#endif
int LocateVex(MGraph *G, VertexType v) /* 返回顶点的数组下标位置 */
{
if(!G)
return -1;
/* 用折半查找 */
int low, high, mid;
low = 0;
high = G->vexnum - 1;
while(low <= high)
{
mid = (low + high) / 2;
if(G->vexs[mid] == v)
return mid;
else if(G->vexs[mid] < v)
low += 1;
else
high -=1;
}
return -1;
}
int Input(InfoType *info) /* 输入弧的信息 */
{
printf("please input arc message: ");
scanf("%d",info);
return OK;
}
int CreateUDN(MGraph **G)
{
/*
** 采用数组,(邻接矩阵)表示法,构造无向网G
*/
assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
int IncInfo; /* 工作变量 */
int i, j, k; /* 工作变量 */
int v1, v2, w; /* 一条边依附的顶点及权值 */
printf("please input vexnum, arcnum and IncInfo:/n");
scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo); /* IncInfo为0则各弧不含其他信息 */
for(i = 0 ; i < (*G)->vexnum ; i++) /* 构造顶点向量 */
{
scanf("%d",&(*G)->vexs[i]);
}
for(i = 0 ; i < (*G)->vexnum ; i++) /* 初始化邻接矩阵 */
{
for(j = 0 ; j < (*G)->vexnum ; j++)
{
(*G)->arcs[i][j].adj = INFINITY;
(*G)->arcs[i][j].info = 0;
}
}
for(k = 0 ; k < (*G)->arcnum ; k++) /* 构造邻接矩阵 */
{
scanf("%d%d%d",&v1, &v2, &w); /* 输入一条边依附的顶点及权值 */
i = LocateVex((*G), v1); /* 确定v1在G中的位置 */
j = LocateVex((*G), v2); /* 确定v2在G中的位置 */
(*G)->arcs[i][j].adj = w; /* 弧(v1,v2)的权值,对无权图用1或0表示 */
if(IncInfo) /* 若弧含有相关信息,则输入 */
{
(*G)->arcs[i][j].info = (InfoType*)malloc /* 因为info是指针,所以首先要生成空间存放数据 */
(sizeof(InfoType));
Input((*G)->arcs[i][j].info); /* 输入弧的信息 */
}
(*G)->arcs[j][i] = (*G)->arcs[i][j]; /* 置(v1,v2)的对称弧(v2,v1) */
}
return OK;
}
int CreateDN(MGraph **G)
{
/*
** 采用数组,(邻接矩阵)表示法,构造有向网G
*/
assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
int IncInfo; /* 工作变量 */
int i, j, k; /* 工作变量 */
int v1, v2, w; /* 一条边依附的顶点及权值 */
printf("please input vexnum, arcnum and IncInfo:/n");
scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo); /* IncInfo为0则各弧不含其他信息 */
for(i = 0 ; i < (*G)->vexnum ; i++) /* 构造顶点向量 */
{
scanf("%d",&(*G)->vexs[i]);
}
for(i = 0 ; i < (*G)->vexnum ; i++) /* 初始化邻接矩阵 */
{
for(j = 0 ; j < (*G)->vexnum ; j++)
{
(*G)->arcs[i][j].adj = INFINITY;
(*G)->arcs[i][j].info = 0;
}
}
for(k = 0 ; k < (*G)->arcnum ; k++) /* 构造邻接矩阵 */
{
scanf("%d%d%d",&v1, &v2, &w); /* 输入一条边依附的顶点及权值 */
i = LocateVex((*G), v1); /* 确定v1在G中的位置 */
j = LocateVex((*G), v2); /* 确定v2在G中的位置 */
(*G)->arcs[i][j].adj = w; /* 弧(v1,v2)的权值,对无权图用1或0表示 */
if(IncInfo) /* 若弧含有相关信息,则输入 */
{
(*G)->arcs[i][j].info = (InfoType*)malloc /* 因为info是指针,所以首先要生成空间存放数据 */
(sizeof(InfoType));
Input((*G)->arcs[i][j].info); /* 输入弧的信息 */
}
}
return OK;
}
int CreateUDG(MGraph **G)
{
/*
** 采用数组,(邻接矩阵)表示法,构造无向图G
*/
assert((*G) = (MGraph*)malloc(sizeof(MGraph)));
int IncInfo; /* 工作变量 */
int i, j, k; /* 工作变量 */
int v1, v2, w; /* 一条边依附的顶点及权值 */
printf("please input vexnum, arcnum and IncInfo:/n");
scanf("%d%d%d", &(*G)->vexnum, &(*G)->arcnum, &IncInfo); /* IncInfo为0则各弧不含其他信息 */
for(i = 0 ; i < (*G)->vexnum ; i++) /* 构造顶点向量 */
{
scanf("%d",&(*G)->vexs[i]);
}
for(i = 0 ; i < (*G)->vexnum ; i++) /* 初始化邻接矩阵 */
{
for(j = 0 ; j < (*G)->vexnum ; j++)
{
(*G)->arcs[i][j].adj = INFINITY;
(*G)->arcs[i][j].info = 0;
}
}
for(k = 0 ; k < (*G)->arcnum ; k++) /* 构造邻接矩阵 */
{
scanf("%d%d%d",&v1, &v2, &w); /* 输入一条边依附的顶点及权值 */
i = LocateVex((*G), v1); /* 确定v1在G中的位置 */
j = LocateVex((*G), v2); /* 确定v2在G中的位置 */
(*G)->arcs[i][j].adj = w; /* 弧(v1,v2)的权值,对无权图用1或0表示 */
if(IncInfo) /* 若弧含有相关信息,则输入 */
{
(*G)->arcs[i][j].info = (InfoType*)malloc /* 因为info是指针,所以首先要生成空间存放数据 */
(sizeof(InfoType));
Input((*G)->arcs[i][j].info); /* 输入弧的信息 */
}
(*G)->arcs[j][i] = (*G)->arcs[i][j]; /* 置(v1,v2)的对称弧(v2,v1) */
}
return OK;
}
int PrintMatrix(MGraph *G) /* 打印邻接矩阵 */
{
int i, j;
for(i = 0 ; i < G->vexnum ; i++)
{
for(j = 0 ; j < G->vexnum ; j++)
{
printf("%5d",G->arcs[i][j]);
}
printf("/n");
}
return OK;
}
void main()
{
MGraph *G = NULL;
//CreateUDN(&G); /* 建立无向网 */
CreateDN(&G); /* 建立有向网 */
PrintMatrix(G);
}