码迷,mamicode.com
首页 > 其他好文 > 详细

3.2 网状关系:图(1)

时间:2016-07-19 09:17:59      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

3-6 AdjMatrixGraph.c

 1 #define VERTEX_MAX 26   //图的最大顶点数   
 2 #define MAXVALUE 32767 //最大值(可设为一个最大整数) 
 3 typedef struct
 4 {
 5     char Vertex[VERTEX_MAX]; //保存顶点信息(序号或字母)
 6     int Edges[VERTEX_MAX][VERTEX_MAX]; //保存边的权 
 7     int isTrav[VERTEX_MAX]; //遍历标志 
 8     int VertexNum; //顶点数量 
 9     int EdgeNum;//边数量 
10     int GraphType; //图的类型(0:无向图,1:有向图)    
11 }MatrixGraph; //定义邻接矩阵图结构 
12 
13 void CreateMatrixGraph(MatrixGraph *G);//创建邻接矩阵图 
14 void OutMatrix(MatrixGraph *G); //输出邻接矩阵
15 
16 void CreateMatrixGraph(MatrixGraph *G)//创建邻接矩阵图 
17 {
18     int i,j,k,weight;
19     char start,end; //边的起始顶点 
20     printf("输入各顶点信息\n");
21     for(i=0;i<G->VertexNum;i++) //输入顶点 
22     {
23         getchar();
24         printf("第%d个顶点:",i+1);
25         scanf("%c",&(G->Vertex[i])); //保存到各顶点数组元素中 
26     }
27     printf("输入构成各边的两个顶点及权值(用逗号分隔):\n"); 
28     for(k=0;k<G->EdgeNum;k++)  //输入边的信息 
29     {
30         getchar(); //暂停输入 
31         printf("第%d条边:",k+1);
32         scanf("%c,%c,%d",&start,&end,&weight);
33         for(i=0;start!=G->Vertex[i];i++); //在已有顶点中查找始点 
34         for(j=0;end!=G->Vertex[j];j++); //在已有顶点中查找结终点 
35         G->Edges[i][j]=weight; //对应位置保存权值,表示有一条边
36         if(G->GraphType==0)  //若是无向图
37             G->Edges[j][i]=weight;//在对角位置保存权值  
38     }
39 }
40 
41 void OutMatrix(MatrixGraph *G)//输出邻接矩阵 
42 {
43     int i,j;
44     for(j=0;j<G->VertexNum;j++)
45         printf("\t%c",G->Vertex[j]);          //在第1行输出顶点信息 
46     printf("\n");
47     for(i=0;i<G->VertexNum;i++) 
48     {
49         printf("%c",G->Vertex[i]);
50         for(j=0;j<G->VertexNum;j++)
51         {
52             if(G->Edges[i][j]==MAXVALUE) //若权值为最大值 
53                 printf("\t∞");          //输出无穷大符号 
54             else
55                 printf("\t%d",G->Edges[i][j]); //输出边的权值 
56         }
57         printf("\n");
58     }             
59 }

3-7 MatrixGraphTest.c

 1 #include <stdio.h>
 2 #include "3-6 AdjMatrixGraph.c"
 3 int main()
 4 {
 5     MatrixGraph G; //定义保存邻接矩阵结构的图 
 6     int i,j;
 7     printf("输入生成图的类型(0:无向图,1:有向图):");
 8     scanf("%d",&G.GraphType); //图的种类
 9     printf("输入图的顶点数量和边数量:");
10     scanf("%d,%d",&G.VertexNum,&G.EdgeNum); //输入图顶点数和边数 
11     for(i=0;i<G.VertexNum;i++)  //清空矩阵 
12         for(j=0;j<G.VertexNum;j++)
13             G.Edges[i][j]=MAXVALUE; //设置矩阵中各元素的值为最大值         
14     CreateMatrixGraph(&G); //创建用邻接表保存的图 
15     printf("邻接矩阵数据如下:\n");
16     OutMatrix(&G);
17     getch();
18     return 0;
19 }

3-8 AdjListGraph.c

 1 #define VERTEX_MAX 20   //图的最大顶点数   
 2 typedef struct edgeNode   
 3 {
 4     int Vertex; //顶点信息(序号或字母) 
 5     int weight; //权值
 6     struct edgeNode *next; //指向下一个顶点指针 (当前顶点和指向的下一顶点构成一条边) 
 7 }EdgeNode; //邻接表边结构 
 8 
 9 typedef struct   
10 {
11     EdgeNode* AdjList[VERTEX_MAX]; //指向每个顶点的指针
12     int VextexNum,EdgeNum; //图的顶点的数量和边的数量  
13     int GraphType; //图的类型(0:无向图,1:有向图)
14 }ListGraph;  //图的结构 
15 
16 void CreateGraph(ListGraph *G); //生成图的邻接表   
17 void OutList(ListGraph *G); //输出邻接表
18 
19 void CreateGraph(ListGraph *G)  //构造邻接表结构图
20 {
21     int i,weight;
22     int start,end;
23     EdgeNode *s;
24     for(i=1;i<=G->VextexNum;i++)//将图中各顶点指针清空 
25         G->AdjList[i]=NULL;
26     for(i=1;i<=G->EdgeNum;i++) //输入各边的两个顶点 
27     {
28         getchar();
29         printf("第%d条边:",i); 
30         scanf("%d,%d,%d",&start,&end,&weight); //输入边的起点和终点
31         s=(EdgeNode *)malloc(sizeof(EdgeNode)); //申请保存一个顶点的内存 
32         s->next=G->AdjList[start]; //插入到邻接表中 
33         s->Vertex=end; //保存终点编号
34         s->weight=weight; //保存权值 
35         G->AdjList[start]=s; //邻接表对应顶点指向该点 
36         if(G->GraphType==0) //若是无向图,再插入到终点的边链中
37         {
38             s=(EdgeNode *)malloc(sizeof(EdgeNode)); //申请保存一个顶点的内存 
39             s->next=G->AdjList[end];
40             s->Vertex=start;
41             s->weight=weight;
42             G->AdjList[end]=s;
43         }
44     }   
45 } 
46 void OutList(ListGraph *G)
47 {
48     int i;
49     EdgeNode *s;
50     for(i=1;i<=G->VextexNum;i++)
51     {
52         printf("顶点%d",i); 
53         s=G->AdjList[i];
54         while(s)
55         {
56             printf("->%d(%d)",s->Vertex,s->weight); 
57             s=s->next;
58         }
59         printf("\n");
60     }
61 }

3-9 AdjListGraphTest.c

 1 #include <stdio.h>
 2 #include "3-8 AdjListGraph.c"
 3 int main()
 4 {
 5     ListGraph G; //定义保存邻接表结构的图 
 6     printf("输入生成图的类型(0:无向图,1:有向图):");
 7     scanf("%d",&G.GraphType); //图的种类
 8     printf("输入图的顶点数量和边数量:");
 9     scanf("%d,%d",&G.VextexNum,&G.EdgeNum); //输入图顶点数和边数 
10     printf("输入构成各边的两个顶点及权值(用逗号分隔):\n"); 
11     CreateGraph(&G); //生成邻接表结构的图
12     printf("输出图的邻接表:\n");
13     OutList(&G); 
14     getch();
15     return 0;
16 }

 

3.2 网状关系:图(1)

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5683134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!