图的邻接矩阵存储结构

1.变量声明和定义
#define OK 1
#define ERROR -1
#define MAX_VERTEX_NUM 20          //顶点个数最大值为20
#define INFINITY    INT_MAX    //权值的最大值∞
typedef int ArcType;           //顶点之间的关系(弧的类型)为整型 
typedef char VertexType;       //顶点数据类型为字符型
typedef int Status;
typedef enum{DG,DN,UDG,UDN} Graphkind    //图的类型,分为{有向图,有向网,无向图,无向网}
2.邻接矩阵存储结构
/*-------------------零阶矩阵存储结构---------------*/
typedef struct
{                              
    VertexType vexs[MAX_VERTEX_NUM];              //顶点向量,存储所有顶点的信息        
    ArcType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵n*n,存储各个顶点之间边的信息
    int vexnum;                                   //顶点总数n   
    int arcnum;                                   //弧(边)总数e
}MGraph;  
3.邻接矩阵构造图(网)

邻接矩阵无向网的构造方法:
①先输入总顶点数n和边数e;
②依次输入n个顶点的信息,并存入顶点表的一维数组中
③初始化邻接矩阵,每个边的权值初始化为∞或0
④构造邻接矩阵,对有边的顶点间设置权值
1.无向网转换成有向网,只需要对单一方向的弧进行一次权值赋值
2.无向网转换成无向图,只需要在初始化时令所有顶点之间弧为0,
对顶点间存在弧时对弧赋值为1,其余不变。
3.无向图转换成有向图,则为1和2的总和

/*---------------无向网的构造,用邻接矩阵表示------------*/
Status CreateUDN(MGraph &G)
{
    int i,j,k,w;
    VertexType v1,v2;                  //初始点v1,终端点v2
    printf("输入顶点数n:");
    scanf("%d",&G.vexnum);             //输入总顶点数n
    printf("\n");
    printf("输入弧的总数e:");
    scanf("%d",&G.arcnum);             //输入总弧数e
    printf("\n");
    getchar();
    printf("依次输入%d个顶点信息:\n",G.vexnum);
    for(i=0;i<G.vexnum;++i) 
        scanf("%c",&G.vexs[i]);        //输入n个顶点值,存入一维向量
    for(i=0;i<G.vexnum;++i)            //对邻接矩阵n*n个单元初始化,对各边赋权值为∞
    {
        for(j=0;j<G.vexnum;++j) G.arcs[i][j]=INFINITY; 
    }
    for(k=0;k<G.arcnum;++k)         //给邻接矩阵有关单元赋初值(循环次数=边数e)
    {   
        getchar();
        printf("输入初始顶点v1:");
        scanf("%c",&v1);
        getchar();
        printf("请输入终端顶点v2:");
        scanf("%c",&v2);
        getchar();
        printf("输入%c到%c弧的权值w:",v1,v2);
        scanf("%d",&w);
        printf("\n");
        i=LocateVex(G,v1); 
        j=LocateVex(G,v2);           //找到两顶点在矩阵中的位置(n次)
        G.arcs[i][j]=w;              //输入对应权值
        G.arcs[j][i]=G.arcs[i][j];   //无向网是对称矩阵
    } 
    return OK;    
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值