标签:
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 }
标签:
原文地址:http://www.cnblogs.com/wozixiaoyao/p/5683134.html