• 大学实验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个字符,结束符""占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("
    输入所有的顶点:");
     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("
    ");
    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("
    ");
     8     printf("无向图的:
    ");
     9     printf("序号i=");
    10     /*输出列号*/
    11     for(i=0; i<G.vexnum; i++)
    12         printf("%8d",i);
    13     printf("
    ");
    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("
    ");
    22     }
    23 }

     

    运行效果

    参考文献

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

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

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

     

    昔日我曾苍老,如今风华正茂(ง •̀_•́)ง
  • 相关阅读:
    后向边
    图的割点、桥和双连通分支的基本概念
    Hihocoder 1062 最近公共祖先1
    会场问题 差分解法
    POJ2976 01分数规划 普通题
    Hihocoder 1049
    hihocoder 1050树中最长路
    Hihocoder 1055
    POJ1463
    C语言|博课作业02
  • 原文地址:https://www.cnblogs.com/lgqrlchinese/p/10104851.html
Copyright © 2020-2023  润新知