图的存储

来源:互联网 发布:淘宝玻璃观察窗 编辑:程序博客网 时间:2024/05/13 23:06

我们前面所说的树,它的关系是一对多,至于图,各个节点之间的关系就更为复杂,变为多对多了。
我们要存储一个图,一般分一下几个部分:
图的类型:有向图、有向网、无向图、无向网。其中有向与无向的概念大家都好理解,至于网与图的区别就是图中弧是否对权值进行操作。
我们在处理问题时,大多都是对网操作。
节点个数
弧的条数
我们可以用邻接矩阵来表示节点之间的关系,其中可以存储两节点之间的权值,也可以只表示两节点有关系。这些可以设置其中的值来区别。
一个图的存储大致就是如上,我们来用代码表示这些。
这些是存储结构:
#define MAX_VERTEX_NUM  10              //节点最大值
typedef int VertexType;                 
typedef int VRType;
typedef enum{DG=1,DN,UDG,UDN} GraphKind;  //图的类型:有向图、有向网、无~~
typedef struct {                        //图的架构 
    VertexType vexs[MAX_VERTEX_NUM];           //顶点向量 
    VRType   arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];                   //邻接矩阵 
    int vexnum,arcnum;                  //节点和弧的个数 
    GraphKind   kind;                   //图的类型 
}MGraph;

这些是图存储操作:
/*********************************************/
/*          CreateGraph始                    */
/*          参数:图G                        */
/*          功能:赋值G.kind                 */
/*********************************************/
void CreateGraph(MGraph &G)
{
    int ch;
    printf("\t\t欢 迎 进 行 建 图 操 作\n");
    printf("\t\t  1.有 向 图\n"); 
    printf("\t\t  2.有 向 网\n");
    printf("\t\t  3.无 向 图\n");
    printf("\t\t  4.无 向 网\n");
    printf("\t\t  5.退出\n");
    ch = 0;
    printf("请输入您的选择:\t");
    while(0 == ch)
    {
        scanf("%d",&ch);
        if(ch<=UDN&&ch>=DG)
            G.kind = (GraphKind)ch;
        else if(EXIT != ch)
            ch = 0;
        switch(ch){
            case DG:     CreateDG(G);   break;      //构造有向图 
            case DN:     CreateDN(G);   break;      //构造有向网 
            case UDG:    CreateUDG(G);  break;      //构造无向图
            case UDN:    CreateUDN(G);  break;      //构造无向网
            case EXIT:   printf("退出成功!\n");break;
            default:     printf("输入错误!请重输入:\t");
    }
}


/*********************************************/
/*          LocateVex                        */
/*          参数:G,vex                      */
/*          功能查找顶点位置               */
/*********************************************/
int LocateVex(const MGraph *g,const VertexType vex)
{
int i;
for(i=0;i<g->vexnum;i++)
if(g->vexs[i] == vex) return i;
}

原创粉丝点击