图的存储和基本操作

1 邻接矩阵法

邻接矩阵存储结构定义:

#define Maxvertexnum 100   //顶点数目的最大值
typedef char vertextype;    //顶点的数据类型
typedef int edgetype;        //边上权值的上数据类型
typedef struct{
    vertextype vex[maxvertexnum];   //顶点表
    edgetype edge[maxvertexnum][maxvertexnum]; //邻接矩阵,边表
    int vexnum,arcnum;              //图的当前结点数和弧数

}

2 邻接表法

顶点域             边表头指针

data

firstarc

             顶点表

                    邻接点域                                   指针域

adjvex nextarc

                                                 边表

邻接表存储结构定义:

#define maxvertexnum 100      //图中顶点数目的最大值
typedef struct ArcNode{       //边表结点
    int adjvex;               //该弧所指向的顶点位置
    struct ArcNode *next;     //指向下一条弧的指针
}ArcNode;

typedef struct Vnode{         //顶点表结点
        vertextype data;      //顶点信息
        ArcNode *first;        //指向第一条依附该顶点的弧的指针

}Vnode,adjlist[maxvertexnum];

typedef struct{
    adjlist  vertices;   //邻接表
    int vexnum,arcnum ;   //图的顶点数和弧数
}Algraph;

3 十字链表(有向图)

                                              弧结点

tailvex headvex hlink tlink info

弧结点中有5个域,尾域(tailvex)指向弧尾,头域(headvex)指向弧头

链域(hlink)指向弧头相同的下一条弧,链域(tlink)指向弧尾相同的下一条弧

info域指向该弧的相关信息

                                             顶点结点

data firstin firstout

data域存放顶点相关的数据信息,如顶点名称

 firstin指向以该顶点为弧头的第一个弧结点

firstout指向以该顶点为弧尾的第一个弧结点

#define maxvertexnum 100
typedef struct arcnode{   //边表结点
        int tailvex,headvex;     //该弧的头尾结点
        struct arcnode *hlink,*tlink; //分别指向弧头相同和弧尾相同的结点

}ARCnode;

typedef struct vnode{  //顶点表结点
    vertextype data;                //顶点表结点
    arcnode *firstin,*firstout;     //指向第一条入弧和出弧

}vnode;

typedef stuct{
    vnode xlist[maxvertexnum];   //邻接表
    int vexnum,arcnum;         //图的顶点数和弧数
}

4邻接多重表(无向图)

mark ivex ilink jverx jlink info

mark:标志域,用以标记该条边是否被搜索过

ivex和jvex为该边依附的两个顶点在图中位置

ilink指向下一条依附于顶点ivex的边

jlink指向下一条依附于顶点jvex的边

info为指向和边相关的各种信息的指针域

每个顶点也用一个结点表示,它由如下所示的两个域组成

data firstedge

data域存储该顶点的相关信息

firstedge域指示第一条依附于该顶点的边

#define Maxvertexnum 100          //图中顶点数目的最大值
typedef struct Arcnode{           //边表结点
        bool mark;                 //访问标记
        int ivex,jvex;            //分别指向该弧的两个结点
        struct Arcnode *ilink,*jlink ;   //分别指向两个顶点的下一条边
       
}Arcnode;

typedef stuct Vnode{           //顶点表结点
        vertextype data;       //顶点信息
        arcnode  *firstedge;    //指向第一条依附于该顶点的边

}vnode;

typedef stuct{
        vnode adjmulist[maxvertexnum];    //邻接表
        int vexnum,arcnum;          //图的顶点数和弧数

}AMLGraph;                          //AMLGraph 是以邻接表存储的图类型

猜你喜欢

转载自blog.csdn.net/dongfengxueli/article/details/81456189
今日推荐