图的数组表示方法

/*
图:
    数组表示法创建
*/
#include
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<     int i,j;
    for( i=0;i         cin >> G->vexs[i];
    }
    for( i=0;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<<"输入"<     for( int k=0;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<     int i,j;
    for( i=0;i         cin >> G->vexs[i];
    }
    for( i=0;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<<"输入"<     for( int k=0;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<     int i,j;
    for( i=0;i         cin >> G->vexs[i];
    }
    for( i=0;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<<"输入"<     for( int k=0;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<     int i,j;
    for( i=0;i         cin >> G->vexs[i];
    }
    for( i=0;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<<"输入"<     for( int k=0;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):"<     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;ivexnum;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<                 
                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<                 
            }
        }
    }
    cout<<"====================="< }

void TraverD(MGraph* G)
{
    VErtexType origin, terminus;     //边的起点,终点
    for(int i=0;ivexnum;i++){
        for(int j=0;jvexnum;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<             }
        }
    }
    cout<<"====================="< }

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;
}

你可能感兴趣的:(图)