数据结构之图的邻接矩阵的操作

邻接矩阵

  邻接矩阵用两个数组表示图的,一个是一维数组,存储图中顶点的信息,另一个是二维数组即矩阵,存储顶点之间相邻的信息,也就是边的信息。
  设图G=(V,E)有n的顶点,则其对应的邻接矩阵A是个n*n的二维数组:
         A[i,j]=1 表示i和j之间连通
         A[i,j]=0 表示i和j之间不连通
   注:无向图对应的邻接矩阵一定是个对称矩阵,有向图的矩阵则不一定对称

算法实现

  • 图的邻接矩阵数据类型描述
typedef struct
{
    char V[MAXSIZE];   //顶点信息
    int arcs[MAXSIZE][MAXSIZE];   //邻接矩阵
    int e;   //边数
    int n;   //顶点数
}Graph;
  • 顶点查找函数,返回其在顶点数组中的索引号

int LocateVex(Graph *G,char v)
{
    for(int i=0;i<G->n;i++)
    {
        if(G->V[i]==v)
        {
            return i;
        }
    }
    return -1;
}
  • //创建、初始化图

int CreateAdj(Graph *G)
{
    int i,j,k;
    char v1,v2;
    cout<<"请输入图的顶点数和边数"<<endl;
    cout<<"顶点数n=";
    cin>>G->n;
    cout<<"边数e=";
    cin>>G->e;

    cout<<"请输入图的顶点信息"<<endl;
    getchar();   //单个读取屏幕上的字符串
    for(i=0;i<G->n;i++)
    {
        //构造顶点信息
        cin>>G->V[i];
    }

    for(i=0;i<G->n;i++)
    {
        //构造顶点信息
        cout<<"顶点信息  "<<G->V[i];
    }
    cout<<endl;


    //初始化邻接矩阵
    for(i=0;i<G->n;i++)
    {
        for(j=0;j<G->n;j++)
        {
            G->arcs[i][j]=0;
        }
    }

    cout<<"请输入图的边的信息"<<endl;
    for(k=0;k<G->e;k++)
    {
        cout<<"请输入第"<<k+1<<"条边的两个端点"<<endl;

        //输入一条边的两个顶点
        /*v1=getchar();   //单个字符的输入
        v2=getchar();*/
        getchar();
        cin>>v1;
        cout<<" ***** v1  "<<v1<<endl;
        cin>>v2;
        cout<<" ***** v2  "<<v2<<endl;

        //确定两个顶点在图G中的位置
        i=LocateVex(G,v1);
        cout<<"v1  "<<i<<endl;
        j=LocateVex(G,v2);
        cout<<"v2       "<<j<<endl;
        if(i>=0&&j>=0)
        {
            //构造无向图的邻接矩阵
            G->arcs[i][j]=1;
            G->arcs[j][i]=1;

            //构造有向图的邻接矩阵
            //G->arcs[i][j]=1;
        }
    }

}
 注:若要构造有向图的邻接矩阵,则把最后一个for()循环内的对应代码更改为
        if(i>=0&&j>=0)
        {
            //构造有向图的邻接矩阵
            G->arcs[i][j]=1;
        }

运行结果

无向图构建过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值