/* *1.此程序为邻接矩阵表示图,包括构造有向图、有向网、无向图、无向网, *其中只有有向图中包含边(弧)相关信息info,若需要,可修改构造其它图的代码。 *2.在不是边稀疏(e<<n*(n-1)/2)的情况下,用此表示法比用邻接表表示图节省存储空间. *3.和边相关信息较少时也应用此法表示. */ #include <stdio.h> #define NO 0 #define ERROR -1 #define MAX_VERTEX_NUM 20 typedef enum { DG = 1,//有向图 DN,//有向网 UDG,//无向图 UDN,//无向网 }GraphKind; typedef struct ArcCell { int adj;//顶点关系类型,对无权图,用1或0表示相邻否;对带权图,则为权值类型 char info;//该边(弧)相关信息 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { int vexs[MAX_VERTEX_NUM];//顶点向量 AdjMatrix arcs;//邻接矩阵 int vexnum, arcnum;//图的当前顶点数和边(弧)数 GraphKind kind; }MGraph; void ArrayCreateGraph(MGraph G); int LocateVex(MGraph G, int v1); void CreatDG(MGraph G); void CreatDN(MGraph G); void CreatUDG(MGraph G); void CreatUDN(MGraph G); int main(void) { MGraph G; ArrayCreateGraph(G); return 0; } void ArrayCreateGraph(MGraph G) { printf("GraphType(1.DG,2.DN,3.UDG,4.UDN):"); scanf("%d",&G.kind); switch (G.kind) { case 1: CreatDG(G); break; case 2: CreatDN(G); break; case 3: CreatUDG(G); break; case 4: CreatUDN(G); break; default: return; } } /*找出v在G中的位置*/ int LocateVex(MGraph G, int v) { int i; for (i=0; i<G.vexnum; i++) { if (v == G.vexs[i]) { return i; } } return ERROR; } /*有向图存储*/ void CreatDG(MGraph G) { int i, j, k; int v1, v2; printf("Input the vexnum, arcnum:"); scanf("%d %d", &G.vexnum, &G.arcnum); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { G.arcs[i][j].adj = NO; } } printf("Input the vex./n"); for (k=0; k<G.vexnum; k++) { printf("NO.%d :", k+1); scanf("%d", &G.vexs[k]); } printf("Input the Tail and the Head:/n"); for (k=0; k<G.arcnum; k++) { printf("ARC%d :", k+1); scanf("%d %d", &v1, &v2); i = LocateVex(G, v1); j = LocateVex(G, v2); if (ERROR==i || ERROR==j) { printf("the vex doesn't exist."); return; } G.arcs[i][j].adj = 1; } printf("The array is:/n"); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { printf("%5d",G.arcs[i][j].adj); } printf("/n/n"); } } /*有向网存储*/ void CreatDN(MGraph G) { int i, j, k; int v1, v2, w; printf("Input the vexnum, arcnum:"); scanf("%d %d", &G.vexnum, &G.arcnum); printf("Input the vex'num:/n"); for (i=0; i<G.vexnum; i++) { printf("NO.%d: ", i+1); scanf("%d", &G.vexs[i]); } for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { G.arcs[i][j].adj = NO; } } printf("Input the Tail ,Head and the weight/n"); for (k=0; k<G.arcnum; ++k) { printf("ARC%d: ",k+1); scanf("%d %d %d", &v1, &v2, &w); i = LocateVex(G, v1); j = LocateVex(G, v2); if (ERROR==i || ERROR==j) { printf("the vex doesn't exist."); return; } G.arcs[i][j].adj = w; } printf("The array is:/n"); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { printf("%5d",G.arcs[i][j].adj); } printf("/n/n"); } } /*无向图存储*/ void CreatUDG(MGraph G) { int i, j, k; int v1, v2; printf("Input the vexnum, arcnum:"); scanf("%d %d", &G.vexnum, &G.arcnum); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { G.arcs[i][j].adj = NO; } } printf("Input the vex./n"); for (k=0; k<G.vexnum; k++) { printf("NO.%d :", k+1); scanf("%d", &G.vexs[k]); } for (i=0; i<G.vexnum; i++)//初始化邻接矩阵 { for (j=0; j<G.vexnum; j++) { G.arcs[i][j].adj = NO; } } printf("Input the arc's vexes./n"); for (k=0; k<G.arcnum; k++) { printf("ARC%d :", k+1); scanf("%d %d", &v1, &v2); while (v2<v1 || v2==v1) { printf("The second arc must be biger than the first!/n"); scanf("%d %d", &v1, &v2); } i = LocateVex(G, v1); j = LocateVex(G, v2); if (ERROR==i || ERROR==j) { printf("the vex doesn't exist."); return; } G.arcs[i][j].adj = 1; G.arcs[j][i].adj = G.arcs[i][j].adj; } printf("The array is:/n"); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { printf("%5d",G.arcs[i][j].adj); } printf("/n/n"); } } /*无向网存储,时间复杂度为O(n*n+e*n)*/ void CreatUDN(MGraph G) { int i, j, k; int v1, v2, w; int IncInfo; printf("Input the vexnum, arcnum, IncInfo:");//IncInfo为0,边(弧)无相关信息 scanf("%d %d %d", &G.vexnum, &G.arcnum, &IncInfo); printf("Input the vex'num:/n"); for (i=0 ; i<G.vexnum; i++) { printf("NO.%d: ", i+1); scanf("%d", &G.vexs[i]); } for (i=0; i<G.vexnum; i++)//初始化邻接矩阵,耗费O(n*n)时间 { for (j=0; j<G.vexnum; j++) { G.arcs[i][j].adj = NO; G.arcs[i][j].info = '0'; } } printf("Input the arc's vexes and weight/n"); for (k=0; k<G.arcnum; ++k) { printf("ARC%d: ",k+1); scanf("%d %d %d", &v1, &v2, &w);//一条边依附的顶点及权值 while (v2<v1 || v2==v1) { printf("The second arc must be biger than the first!/n"); scanf("%d %d %d", &v1, &v2, &w); } i = LocateVex(G, v1); j = LocateVex(G, v2); if (ERROR==i || ERROR==j) { printf("the vex doesn't exist."); return; } G.arcs[i][j].adj = w; if (IncInfo) { printf("Input the G.arcs' informations:/n"); fflush(stdin); scanf("%c", &G.arcs[i][j].info); } G.arcs[j][i].adj= G.arcs[i][j].adj; G.arcs[j][i].info = G.arcs[i][j].info; } printf("The array is:/n"); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { printf("%5d",G.arcs[i][j].adj); } printf("/n/n"); } if (IncInfo) { printf("The G.arcs' informations are:/n"); for (i=0; i<G.vexnum; i++) { for (j=0; j<G.vexnum; j++) { printf("%c,", G.arcs[i][j].info); } printf("/n"); } } }