图的邻接矩阵表示方法
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define OK 1 5 #define NO 0 6 #define TRUE 1 7 #define FALSE 0 8 #define ERROR -1 9 #define MAX_VERTEX_NUM 20 10 #define INFINITY 20000000 11 12 typedef int Status; 13 typedef enum{DG,DN,UDG,UDN}GraphKind;//0-有向图,1-有向网(带权值),2-无向图,3-无向网(带权值) 14 typedef int VRType;//图表顶点关系类型 15 typedef struct ArcCell 16 { 17 VRType adj;//带权图中表示权值,无权图中用0、1表示是否相邻 18 }ArcCell; 19 typedef ArcCell AdjMatrix[MAX_VERTEX_NUM+1][MAX_VERTEX_NUM+1];//领接矩阵 20 /*图、表(数组表示方法)的存储表示*/ 21 typedef char VertexType_M;//图、表顶点类型 22 typedef struct 23 { 24 VertexType_M vexs[MAX_VERTEX_NUM+1];//顶点向量 25 AdjMatrix arcs;//领接矩阵 26 int vexnum,arcnum;//图和表当前的顶点数和弧数 27 int IncInfo;//为0则各弧不包含其他的信息 28 29 GraphKind kind; 30 }MGraph; 31 32 /*全局变量*/ 33 Status visited[MAX_VERTEX_NUM+1];//标志数组 34 35 Status CreateGraph_M(MGraph *G,int r); 36 37 Status CreateDG_M(MGraph *G); 38 39 Status CreateDN_M(MGraph *G); 40 41 Status CreateUDG_M(MGraph *G); 42 43 Status CreateUDN_M(MGraph *G); 44 45 int LocateVex_M(MGraph G,VertexType_M u);//寻找顶点u的位置 46 47 void OutputMGraph(MGraph G); 48 49 50 int main(int argc,char**argv) 51 { 52 MGraph G; 53 54 printf("1、2、3、4、5\n函数CreateGraph_M等测试..\n"); 55 { 56 int r; 57 srand((unsigned)time(NULL));//用系统的时间做随机数的种子 58 r=rand()%4;//对4取余只能产生0,1,2,3,这几个数 59 switch(r) 60 { 61 case DG: 62 printf("初始化有向图 G..\n"); 63 break; 64 case DN: 65 printf("初始化有向网 G..\n"); 66 break; 67 case UDG: 68 printf("初始化无向图 G..\n"); 69 break; 70 case UDN: 71 printf("初始化无向网 G..\n"); 72 break; 73 } 74 CreateGraph_M(&G,r); 75 printf("\n"); 76 } 77 printf("19\n函数OutputMGraph 测试..\n"); 78 { 79 printf("输出图(网)的邻接矩阵 G = \n"); 80 OutputMGraph(G); 81 printf("\n"); 82 83 84 } 85 86 } 87 Status CreateGraph_M(MGraph *G,int r){ 88 switch(r) 89 { 90 case DG: 91 G->kind=DG; 92 return CreateDG_M(G); 93 case DN: 94 G->kind=DN; 95 return CreateDN_M(G); 96 case UDG: 97 G->kind=UDG; 98 return CreateUDG_M(G); 99 case UDN: 100 G->kind=UDN; 101 return CreateUDN_M(G); 102 default: 103 return ERROR; 104 105 } 106 107 return OK; 108 } 109 110 Status CreateDG_M(MGraph *G){ 111 int i,j,k; 112 VertexType_M v1,v2; 113 114 printf("输入顶点数 "); 115 scanf("%d",&(G->vexnum)); 116 printf("输入弧数 "); 117 scanf("%d",&(G->arcnum)); 118 printf("输入各个顶点值 "); 119 getchar(); 120 for(i=1;i<=G->vexnum;i++) 121 { 122 scanf("%c",&(G->vexs[i])); 123 //printf("%d",G->vexs[i]); 124 } 125 126 printf("初始化邻接矩阵\n"); 127 for(i=1;i<=G->vexnum;i++) 128 { 129 for(j=1;j<=G->vexnum;j++) 130 G->arcs[i][j].adj=0; 131 } 132 for(k=1;k<=G->arcnum;k++) 133 { 134 getchar(); 135 printf("输入相邻结点(添加弧的信息)"); 136 scanf("%c%c",&v1,&v2); 137 i=LocateVex_M(*G,v1); 138 j=LocateVex_M(*G,v2); 139 G->arcs[i][j].adj=1; 140 141 142 } 143 144 return OK; 145 } 146 Status CreateDN_M(MGraph *G){ 147 int i,j,k; 148 VertexType_M v1,v2; 149 VRType w; 150 printf("输入顶点数 "); 151 scanf("%d",&(G->vexnum)); 152 printf("输入弧数 "); 153 scanf("%d",&(G->arcnum)); 154 printf("输入各个顶点值 "); 155 getchar(); 156 for(i=1;i<=G->vexnum;i++) 157 { 158 scanf("%c",&(G->vexs[i])); 159 } 160 161 printf("初始化邻接矩阵\n"); 162 for(i=1;i<=G->vexnum;i++) 163 { 164 for(j=1;j<=G->vexnum;j++) 165 G->arcs[i][j].adj=INFINITY; 166 } 167 for(k=1;k<=G->arcnum;k++) 168 { 169 getchar(); 170 printf("输入相邻结点(添加弧的信息)"); 171 scanf("%c%c%d",&v1,&v2,&w); 172 i=LocateVex_M(*G,v1); 173 j=LocateVex_M(*G,v2); 174 175 G->arcs[i][j].adj=w; 176 } 177 return OK; 178 } 179 Status CreateUDG_M(MGraph *G){ 180 int i,j,k; 181 VertexType_M v1,v2; 182 183 printf("输入顶点数 "); 184 scanf("%d",&(G->vexnum)); 185 printf("输入弧数 "); 186 scanf("%d",&(G->arcnum)); 187 printf("输入各个顶点值 "); 188 getchar();//后面读取字符串 要加getchar低调前面的回车 189 for(i=1;i<=G->vexnum;i++) 190 { 191 scanf("%c",&(G->vexs[i])); 192 } 193 194 printf("初始化邻接矩阵\n"); 195 for(i=1;i<=G->vexnum;i++) 196 { 197 for(j=1;j<=G->vexnum;j++) 198 G->arcs[i][j].adj=0; 199 } 200 for(k=1;k<=G->arcnum;k++) 201 { 202 getchar(); 203 printf("输入相邻结点(添加弧的信息)"); 204 scanf("%c%c",&v1,&v2); 205 i=LocateVex_M(*G,v1); 206 j=LocateVex_M(*G,v2); 207 G->arcs[i][j].adj=1; 208 G->arcs[j][i]=G->arcs[i][j]; 209 210 211 } 212 213 return OK; 214 } 215 Status CreateUDN_M(MGraph *G){ 216 int i,j,k; 217 VertexType_M v1,v2; 218 VRType w; 219 printf("输入顶点数 "); 220 scanf("%d",&(G->vexnum)); 221 printf("输入弧数 "); 222 scanf("%d",&(G->arcnum)); 223 printf("输入各个顶点值 "); 224 getchar(); 225 for(i=1;i<=G->vexnum;i++) 226 { 227 scanf("%c",&(G->vexs[i])); 228 } 229 230 printf("初始化邻接矩阵\n"); 231 for(i=1;i<=G->vexnum;i++) 232 { 233 for(j=1;j<=G->vexnum;j++) 234 G->arcs[i][j].adj=INFINITY; 235 } 236 for(k=1;k<=G->arcnum;k++) 237 { 238 getchar(); 239 printf("输入相邻结点(添加弧的信息)"); 240 scanf("%c%c%d",&v1,&v2,&w); 241 i=LocateVex_M(*G,v1); 242 j=LocateVex_M(*G,v2); 243 244 G->arcs[i][j].adj=w; 245 G->arcs[j][i]=G->arcs[i][j]; 246 } 247 248 249 return OK; 250 } 251 252 int LocateVex_M(MGraph G,VertexType_M u) 253 { 254 int i; 255 for(i=1;i<=G.vexnum;i++) 256 { 257 if(G.vexs[i]==u) 258 return i; 259 } 260 return 0; 261 262 } 263 264 void OutputMGraph(MGraph G){ 265 int i,j; 266 if(!G.vexnum&&!G.arcnum) 267 printf("空图(表)!\n"); 268 else 269 { 270 printf(" "); 271 for(i=1;i<=G.vexnum;i++) 272 { 273 printf("%3c",G.vexs[i]); 274 } 275 printf("\n"); 276 for(i=1;i<=G.vexnum;i++) 277 { 278 printf("%c",G.vexs[i]); 279 for(j=1;j<=G.vexnum;j++) 280 { 281 if(G.arcs[i][j].adj==INFINITY) 282 printf(" ∞"); 283 else 284 printf("%3d",G.arcs[i][j]); 285 } 286 printf("\n"); 287 288 } 289 } 290 }