第七章 图(一)图的存储结构代码实现

@第七章 图(一)

  • 图的存储结构代码实现(要求重点掌握)
  • 邻接矩阵的存储结构
  • 邻接表的存储结构

一、邻接矩阵代码实现

//图的邻接矩阵表示
#include<iostream>
#include<iomanip>
#include<string.h>
#include<math.h>
#include<malloc/malloc.h>

using namespace std;
#define MaxVertexNum 100    //最大顶点数设为100
typedef int EdgeType;       //边的权值设为整形
typedef char VertexType[100];     //顶点类型设为字符串

typedef struct 
{
    VertexType vertex[MaxVertexNum];        //顶点表
    EdgeType edges[MaxVertexNum][MaxVertexNum];         //邻接矩阵,即边表
    int n,e;            //顶点数和边数
}MGraph;            //MGraph是以邻接矩阵存储的图类型

/*   
  以v1-->v2,v1-->v3,v3-->v4,v4-->v1,v4-->v2为例
*/
int LocateVex(MGraph G,VertexType u)  //G为顶点表(v1、v2、v3、v4),u为每个顶点
{
    int i;
    for(i=0;i<G.n;++i)
        if(strcmp(u,G.vertex[i])==0)  //比较顶点在表中的位置,如v1在表v1、v2、v3、v4中的位置为0,返回值i=0
        return i;                     //如v2在表v1、v2、v3、v4中的位置为1,返回值i=1
    return -1;
}

void CreateMGraphDG(MGraph &G)
{   //建立有向图G的邻接矩阵存储
    int i,j,k;
    VertexType vi,vj;
    cout<< "请输入顶点数和弧数(输入格式为:顶点数,弧数):"<<endl;
    cin>>G.n>>G.e;      //输入顶点数和弧数
    cout<< "请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;
    for(i=0;i<G.n;i++)
        cin>>G.vertex[i];       //输入定点信息,建立顶点表
    for(i=0;i<G.n;i++)
        for(j=0;j<G.n;j++)
            G.edges[i][j]=0;        //初始化邻接矩阵
    cout<< "请输入"<<G.e<< "条弧对应的两个顶点的序号(输入格式为:弧尾,弧头):"<<endl;
    for(k=0;k<G.e;k++)
    {
        cin>>vi>>vj;        //输入e条边,建立邻接矩阵
        i=LocateVex(G,vi);
        j=LocateVex(G,vj);
        G.edges[i][j]=1;     //对输入的两顶点判断其在矩阵的位置,并赋值1,剩下的定点表明无对应关系,为已经的初始化值0
    }
}

void CreateMGraphDN(MGraph &G)
{   //建立有向网G的邻接矩阵存储,边上带权的图也称网
    int i,j,k,w;        //区别于有向图,网要多声明一个变量w来代表各个边上的权值
    VertexType vi,vj;
    cout<< "请输入顶点数和弧数(输入格式为:顶点数,弧数):"<<endl;
    cin>>G.n>>G.e;      //输入顶点数和弧数
    cout<< "请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;
    for(i=0;i<G.n;i++)
        cin>>G.vertex[i];       //输入定点信息,建立顶点表
    for(i=0;i<G.n;i++)
        for(j=0;j<G.n;j++)
            G.edges[i][j]=0;        //初始化邻接矩阵
    cout<< "请输入"<<G.e<< "条弧对应的两个顶点的序号(输入格式为:弧尾,弧头,权值):"<<endl;
    for(k=0;k<G.e;k++)
    {   
        cout<<"弧尾,弧头:";
        cin>>vi>>vj;        //输入e条边&#
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值