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 是以邻接表存储的图类型