大学实验4:利用数组表示法建立无向网

实验目的:深入理解图的邻接矩阵存储结构

实验内容:

         已知某无向网如图所示,要求利用数组表示法建立该网。

 

基本思想:编写两个功能函数,一个负责建立无向网的邻接矩阵存储结构,另一个负责对无向网的打印输出。

步骤1:引入必要的函数库

1 #include <stdio.h>
2 #include <stdlib.h>

 

步骤2:定义常量

/*定义最大的顶点个数*/

#define MAX_VERTEX_NUM 100

/*定义常量INFINITY,该常量表示两个顶点间没有边相关联*/

#define INFINITY 65535

F此时编译一下,看是否正确。

 

步骤3:对抽象的顶点类型和权值类型进行实例化

1 /* 实例化顶点类型:VertexType是用长度为3的字符串实现的,其中顶点名称占2个字符,结束符"\0"占1个字符 */
2 typedef char VertexType[3];
3 /*实例化权值类型:EdgeType是用整型实现的*/
4 typedef int EdgeType;

F此时编译一下,看是否正确。

 

步骤4:定义结构体

1 typedef struct {
2     VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
3     EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
4     int vexnum, arcnum;  //顶点数量和边的数量
5 } MGraph;

F此时编译一下,看是否正确。

 

步骤5:声明以下功能函数

1 /*建立无向网的邻接矩阵存储结构*/
2 void CreateMGraph(MGraph *G);
3 /*输出无向网的邻接矩阵存储结构*/
4 void DisplayGraph(MGraph G);

F此时编译一下,看是否正确。

步骤6:实现函数CreateMGraph()。

提示:先建立顶点向量G->vexs[],然后对邻接矩阵G->arcs[][]进行初始化,最后依次为每一条边赋权值。由于是无向网,因此边<Vi,Vj>对应于邻接矩阵中的两个元素,即G->arcs[i][j]和G->arcs[j][i]。

 1 void CreateMGraph(MGraph *G)
 2 {
 3     /* i,j,k为控制变量,w用于保存用户输入的边的权值*/
 4     int i,j,k,w;
 5     printf("输入顶点数和边数:");
 6     scanf("%d%d",&G->vexnum,&G->arcnum);
 7     printf("\n输入所有的顶点:");
 8     /*输入所有的顶点*/
 9     for (i=0; i<G->vexnum; i++)
10         scanf("%s",&G->vexs[i]);
11     /*初始化邻接矩阵*/
12     for(i=0; i<G->vexnum; i++)
13         for(j=0; j<G->vexnum; j++)
14             G->arcs[i][j]=INFINITY;
15     /*建立邻接矩阵*/
16     for (k=0; k<G->arcnum; k++)
17     {
18         printf("输入边<Vi,Vj>的行下标i,列下标j和权值w:");
19         scanf("%d%d%d",&i,&j,&w);
20         G->arcs[i][j]=w;
21         G->arcs[j][i]=G->arcs[i][j];
22         printf("\n");
23     }
24 }

步骤7:实现函数DisplayGraph()。

 

 1 void DisplayGraph(MGraph G) {
 2     int i,j;
 3     /*输出网中的顶点数,边数和所有的顶点*/
 4     printf("无向网含有%d个顶点和%d条边,顶点依次为:",G.vexnum,G.arcnum);
 5     for(i=0; i<G.vexnum; i++)
 6         printf("%s,",G.vexs[i]);
 7     printf("\n");
 8     printf("无向图的:\n");
 9     printf("序号i=");
10     /*输出列号*/
11     for(i=0; i<G.vexnum; i++)
12         printf("%8d",i);
13     printf("\n");
14     /*输出邻接矩阵中的每一行*/
15     for(i=0; i<G.vexnum; i++) {
16         /*输出行号*/
17         printf("%8d",i);
18         for(j=0; j<G.vexnum; j++)
19             printf("%8d",G.arcs[i][j]);
20         /*换行,准备输出下一行*/
21         printf("\n");
22     }
23 }

 

 

运行效果

参考文献

1.严蔚敏,吴伟民,《数据结构(C语言版)》,清华大学出版社,1997

2.陈锐,《零基础学数据结构》,机械工业出版社,2010

3.程杰,《大话数据结构》,清华大学出版社,2011

 

posted @ 2018-12-08 20:09  龙谷情Sinoam  阅读(878)  评论(0编辑  收藏  举报
Smiley face