图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间只有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能与下一层中多个元素相关,但只能与上一层中一个元素相关。而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,图的应用极为广泛。
可以用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。
邻接矩阵:行、列各对应一个顶点,若第i行对应顶点到第j列对应的顶点有弧相连则A[i][j]=1,否则为0.
辅助宏的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
#define maxn 100
#define INFINITY 32767 //最大值 一定要很大
#define MAX_INFO 50
#define MVNUM 100
typedef int Status;
typedef char VertexType;
typedef char InfoType;
typedef enum {DG,DN,UDG,UDN} GraphKind; //图类型 有向图,无向图, 有向网,无向网
弧的存储结构定义:
typedef struct ArcType {//弧的定义
double adj; //邻接数,0、1或w、无穷大
InfoType *Info; //弧的附加信息
}ArcType;
图的数组表示存储结构定义:
//图的数组表示存储结构定义
typedef struct{
VertexType *vexs; //顶点信息
ArcType **arcs; //邻接矩阵
int vexnum,arcnum; //顶点数 弧数
GraphKind kind; //图的类型标记
}MGraph;
图的创建.
Status CreateGraph(MGraph &G){
//图的创建
//输入图的种类及顶点和边信息构造图G
scanf("%d",&G.kind); //枚举值DG DN UDG UDN 实际输入0 1 2 3
switch(G.kind){
case DG: return CreateDG(G);
case DN: return CreateDN(G);
case UDG:return CreateUDG(G);
case UDN:return CreateUDN(G);
default :return ERROR;
}
}
建立无向网G.
Status CreateUDN(MGraph &G){
//建立无向网G
int IncInfo,i,j,k;
double w;
char s[MAX_INFO];
VertexType v1,v2;
scanf("%d %d %d",&G.vexnum,&G.arcnum,&IncInfo); //IncInfo为0表弧没有附加信息
if(!(G.vexs=(VertexType *)malloc(G.vexnum*sizeof(VertexType))))
exit(OVERFLOW);
if(!(G.arcs=(ArcType **)malloc(G.vexnum*sizeof(ArcType *))))
exit(OVERFLOW);
for(i=0;i<G.vexnum;i++){
if(!(G.arcs[i]=(ArcType *)malloc(G.vexnum*sizeof(ArcType))))
exit(OVERFLOW);
scanf(" %c",&G.vexs[i]);
for(j=0;j<G.vexnum;j++){
G.arcs[i][j].adj=INFINITY; //各弧初始化
G.arcs[i][j].Info=NULL;
}
}
for(k=0;k<G.arcnum;k++){
scanf(" %c %c %lf",&v1,&v2,