图的数组表示方法

/*
图:
    数组表示法创建
*/
#include <iostream>
using namespace std;

#define INFINITY 95533    // 最大值
#define MAX_VERTEX_NUM 20    //最大顶点个数
#define VRType int        //顶点关系类型,对无权图,用1或0表示相邻否;对带权图,则为权值类型
#define InfoType int    //
#define VErtexType int    //图顶点类型
typedef enum {DG,DN,UDG,UDN}GraphKind;    //图的种类(有向图,有向网,无向图,无向网)****枚举类型enum
typedef struct ArcCell {
    VRType adj;        //顶点关系类型
    InfoType *info;    //该弧相关信息的指针
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
    VErtexType vexs[MAX_VERTEX_NUM];    //顶点向量
    AdjMatrix arcs;        //邻接矩阵
    int vexnum, arcnum;        //图的当前顶点数和弧数
    GraphKind    kind;        //图的种类标志
}MGraph;

int LocateVex(MGraph *G,VErtexType point)    //  查找相应的顶点在顶点向量中的位置
{
    for(int i=0;i< G->vexnum;i++){
        if(G->vexs[i] == point){
            return i;
        }
    }
}

void CreateDG(MGraph* &G)   //  有向图
{
    int vexnum,arcnum;   // 有向图的顶点数和边数
    VErtexType origin, terminus;     //边的起点,终点
    cout<<"输入有向图的顶点数和边数:";
    cin >> vexnum >> arcnum;
    G->vexnum = vexnum;
    G->arcnum = arcnum;
    cout<<endl<<"输入"<<vexnum<<"个顶点"<<endl;
    int i,j;
    for( i=0;i<vexnum;i++){    //   顶点装入顶点向量中
        cin >> G->vexs[i];
    }
    for( i=0;i<vexnum;i++){    //    初始化临接矩阵
        for( j=0;j<=i;j++){
            G->arcs[i][j].adj = INFINITY;   
            G->arcs[i][j].info = NULL;
            G->arcs[j][i].adj = INFINITY;   
            G->arcs[j][i].info = NULL;
        }
    }
    cout<<"输入"<<arcnum <<"条边"<<endl;
    for( int k=0;k<arcnum;k++){
        cin >> origin >> terminus;
        i = LocateVex(G,origin);
        j = LocateVex(G,terminus);
        G->arcs[i][j].adj = 0;
    }
}

void CreateDN(MGraph* &G)   // 有向网
{
    int vexnum,arcnum,weight;   // 有向网的顶点数  边数  权重
    VErtexType origin, terminus;     //边的起点,终点
    cout<<"输入有向网的顶点数和边数:";
    cin >> vexnum >> arcnum;
    G->vexnum = vexnum;
    G->arcnum = arcnum;
    cout<<endl<<"输入"<<vexnum<<"个顶点"<<endl;
    int i,j;
    for( i=0;i<vexnum;i++){    //   顶点装入顶点向量中
        cin >> G->vexs[i];
    }
    for( i=0;i<vexnum;i++){    //    初始化临接矩阵
        for( j=0;j<=i;j++){
            G->arcs[i][j].adj = INFINITY;   
            G->arcs[i][j].info = NULL;
            G->arcs[j][i].adj = INFINITY;   
            G->arcs[j][i].info = NULL;
        }
    }
    cout<<"输入"<<arcnum <<"条边,和相应的边对应的权重"<<endl;
    for( int k=0;k<arcnum;k++){
        cin >> origin >> terminus >> weight;
        i = LocateVex(G,origin);
        j = LocateVex(G,terminus);
        G->arcs[i][j].adj = 0;
        G->arcs[i][j].info = new InfoType;
        *(G->arcs[i][j].info) = weight;  //记录相应的权重
    }
}

void CreateUDG(MGraph* G)
{
    int vexnum,arcnum;   // 无向图的顶点数和边数
    VErtexType origin, terminus;     //边的起点,终点
    cout<<"输入无向图的定点数和边数:";
    cin >> vexnum >> arcnum;
    G->vexnum = vexnum;
    G->arcnum = arcnum;
    cout<<endl<<"输入"<<vexnum<<"个顶点"<<endl;
    int i,j;
    for( i=0;i<vexnum;i++){    //   顶点装入顶点向量中
        cin >> G->vexs[i];
    }
    for( i=0;i<vexnum;i++){    //    初始化临接矩阵
        for( j=0;j<=i;j++){
            G->arcs[i][j].adj = INFINITY;   
            G->arcs[i][j].info = NULL;
            G->arcs[j][i].adj = INFINITY;   
            G->arcs[j][i].info = NULL;
        }
    }
    cout<<"输入"<<arcnum <<"条边"<<endl;
    for( int k=0;k<arcnum;k++){
        cin >> origin >> terminus;
        i = LocateVex(G,origin);
        j = LocateVex(G,terminus);
        G->arcs[i][j].adj = 0;
        G->arcs[j][i].adj = 0;
    }
}

void CreateUDN(MGraph* &G)    //  无向网
{
    int vexnum,arcnum,weight;   // 无向网的顶点数  边数  权重
    VErtexType origin, terminus;     //边的起点,终点
    cout<<"输入无向网的定点数和边数:";
    cin >> vexnum >> arcnum;
    G->vexnum = vexnum;
    G->arcnum = arcnum;
    cout<<endl<<"输入"<<vexnum<<"个顶点"<<endl;
    int i,j;
    for( i=0;i<vexnum;i++){    //   顶点装入顶点向量中
        cin >> G->vexs[i];
    }
    for( i=0;i<vexnum;i++){    //    初始化临接矩阵
        for( j=0;j<=i;j++){
            G->arcs[i][j].adj = INFINITY;   
            G->arcs[i][j].info = NULL;
            G->arcs[j][i].adj = INFINITY;   
            G->arcs[j][i].info = NULL;
        }
    }
    cout<<"输入"<<arcnum <<"条边,和相应的边对应的权重"<<endl;
    for( int k=0;k<arcnum;k++){
        cin >> origin >> terminus >> weight;
        i = LocateVex(G,origin);
        j = LocateVex(G,terminus);
        G->arcs[i][j].adj = 0;
        G->arcs[i][j].info = new InfoType;
        *(G->arcs[i][j].info) = weight;  //记录相应的权重
        G->arcs[j][i].adj = 0;
        G->arcs[j][i].info = new InfoType;
        *(G->arcs[j][i].info) = weight;
    }
}

void Create(MGraph* &G)   //  创建图G  选择创建图的类型
{
    int kind;
    cout<<"输入图类型(0.DG/1.DN/2.UDG/3.UDN):"<<endl;
    cin >> kind; 
    switch(kind){
        case DG :
            CreateDG(G);
            break;
        case DN:
            CreateDN(G);
            break;
        case UDG:
            CreateUDG(G);
            break;
        case UDN:
            CreateUDN(G);
            break;
        default:
            break;
    }
}

void TraverUD(MGraph* G)
{
    VErtexType origin, terminus;     //边的起点,终点
    for(int i=0;i<G->vexnum;i++){
        for(int j=0;j<=i;j++){
            if(G->arcs[i][j].adj != INFINITY){
                
                terminus = G->vexs[i];
                origin = G->vexs[j];
                cout << origin << "----" << terminus ;
                if(G->arcs[j][i].info){
                    cout<<"  info= " << *(G->arcs[i][j].info);
                }
                cout<<endl;
                
                origin = G->vexs[i];
                terminus = G->vexs[j];
                cout << origin << "----" << terminus ;
                if(G->arcs[i][j].info){
                    cout<<"  info= " << *(G->arcs[i][j].info);
                }
                cout<<endl;
                
            }
        }
    }
    cout<<"====================="<<endl;
}

void TraverD(MGraph* G)
{
    VErtexType origin, terminus;     //边的起点,终点
    for(int i=0;i<G->vexnum;i++){
        for(int j=0;j<G->vexnum;j++){
            if(G->arcs[i][j].adj != INFINITY){
                origin = G->vexs[i];
                terminus = G->vexs[j];
                cout << origin << "----" << terminus ;
                if(G->arcs[i][j].info){
                    cout<<"  info= " << *(G->arcs[i][j].info);
                }
                cout<<endl;
            }
        }
    }
    cout<<"====================="<<endl;
}

void destroy(MGraph* G)
{
    delete G;
    G = NULL;
}

int main()
{
    while(1){
        MGraph *G = new MGraph;
        Create(G);   //创建无向图
        if(G->kind == UDN || G->kind == UDG){
            TraverUD(G);
        }
        else{
            TraverD(G);
        }
        destroy(G);
    }
    system("pause");
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值