图的邻接矩阵表示方法

  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 }

 

 

posted @ 2017-10-24 14:45  accomplishment  阅读(1624)  评论(0编辑  收藏  举报