//图的存储-邻接矩阵.cpp
#include<stdio.h>
#define MAX 30
typedef enum{DG,DN,UDG,UDN} Graphkind;
typedef struct arccell //定义表示弧的邻接矩阵
{
int adj;
int *info; //弧的相关信息
}arccell,adjmatrix[MAX][MAX];
typedef struct //定义一个图类型
{
int vexs[MAX];
adjmatrix arcs;
int vexnum,arcnum;
Graphkind kind;
}mgraph;
//找出值为v的顶点在图的存储数组中的索引
int locatevex(mgraph g,int v)
{
for(int i=0;i<g.vexnum;++i)
if(g.vexs[i]==v)return i;
}
int createUDG(mgraph &G) //构造无向图
{
int i,j,k;
int v1,v2;
printf("输入无向图的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向图的各顶点的值:/n");
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=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向图边的两个关联顶点:/n");
scanf("%d%d",&v1,&v2);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=1;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
for(i=0;i<G.vexnum;++i)
{
for(j=0;j<G.vexnum;++j)
printf("%d ",G.arcs[i][j].adj);
printf("/n");
}
return 1;
}
int createDG(mgraph &G) //构造有向图
{
int i,j,k;
int v1,v2;
printf("输入无向图的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向图的各顶点的值:/n");
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=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入有向图边的两个关联顶点:/n");
scanf("%d%d",&v1,&v2);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=1;
}
return 1;
}
int createUDN(mgraph &G) //构造无向网
{
int i,j,k;
int v1,v2,w;
printf("输入无向网的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向网的各顶点的值:/n");
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=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向网边的两个关联顶点和边的权值:/n");
scanf("%d%d%d",&v1,&v2,&w);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[i][j]=G.arcs[j][i];
}
return 1;
}
int createDN(mgraph &G) //构造有向网
{
int i,j,k;
int v1,v2,w;
printf("输入有向网的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入有向网的各顶点的值:/n");
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=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向网边的两个关联顶点和边的权值:/n");
scanf("%d%d%d",&v1,&v2,&w);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=w;
}
return 1;
}
int creategraph(mgraph &G)
{
int n;
printf("DG:0 DN:1 UDG:2 UDN:3/n");
scanf("%d",&n);
switch(n)
{
case 0:return createDG(G);
case 1:return createDN(G);
case 2:return createUDG(G);
case 3:return createUDN(G);
default :return 0;
}
}
void main()
{
mgraph g1;
creategraph(g1);
}