算法与数据结构(c语言)——图(Figure,二):存储结构

图的存储结构:

  • 邻接矩阵存储

图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 

无向图 

从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的。

从这个矩阵中,很容易知道图中的信息。

  1. 要判断任意两顶点是否有边无边就很容易了;
  2. 要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行或(第i列)的元素之和;
  3. 求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点;

有向图

有向图讲究入度和出度,顶点vi的入度为1,正好是第i列各数之和。顶点vi的出度为2,即第i行的各数之和。

若图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

 

这里的wij表示(vi,vj)上的权值。无穷大表示一个计算机允许的、大于所有边上权值的值,也就是一个不可能的极限值。

代码实现 

// 顶点的类型
typedef char Vertex;
// 边上的权值类型
typedef int EdgeWeight;
// 表示最大的顶点数量
#define MAXVN 100
// 表示无穷
#define INFINITY 65535

// 定义无向网图的邻接矩阵结点
typedef struct {
    // 顶点集合
    Vertex vexs[MAXVN];
    // 边的集合
    EdgeWeight arc[MAXVN][MAXVN];
    // 顶点数量与边的数量
    int edgeNum,vertexNum;
}MGraph;
/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph *G) {
    int i,j,k,w;
    printf("输入顶点数和边数:");
    scanf("%d,%d",&G->vertexNum,&G->edgeNum);

    for(i = 0; i < G->vertexNum; i++) {
        printf("\n输入第%d个顶点:", i);
        scanf("%d",&G->vexs[i]);
    }

    for(i = 0; i < G->vertexNum; i++) {
        for(j = 0; j < G->vertexNum; j+
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值