邻接矩阵法
结点数为n的图G = (V,E)的邻接矩阵A是n×n的。
将G的顶点编号为v1,v2,,...,Vn,(数组下标)
若∈E,则A[i][j]=1,否则A[i][j]=O。
#define MaxvertexNum 100
typedef char vertexType;
typedef int EdgeType;
typedef struct{
vertexType vex[MaxvertexNum];
EdgeType Edge [MaxvertexNum][MaxvertexNum];
int vexnum, arcnum;
}MGraph;
·邻接矩阵法的空间复杂为O(n2),适用于稠密图
·无向图的邻接矩阵为对称矩阵
·无向图中第i行(或第i列)非0元素(非正无穷)的个数为第i个顶点的度;
有向图中第i行(第列)非0元素(非正无穷)的个数为第i个顶点的出度(入度)
邻接表法为每一个顶点建立一个单链表存放与它相邻的边
顶点表
采用顺序存储,每个数组元素存放顶点的数据和边表的头指针
边表(出边表)
采用链式存储,单链表中存放与一个顶点相邻的所有边,一个链表结点表示一条从该顶点到链表结点顶点的边
#define MaxvertexNum 100
typedef struct ArcNode{
//边表顶点
int adjvex;
struct ArcNode *next;
/ / infoType info;权重
}ArcNode;
typedef struct VNode {
vertexType data; //数据
ArcNode *first;//边表头指针
}VNoode ,AdjList[MaxvertexNum];//顶点表
typedef struct{
AdjList vetices;//邻接表
int vexnum, arcnum;//顶点数/边数
}ALGraph;
邻接表更加适用于稀疏图
若G为无向图,则结点的度为该结点边表的长度
若G为有向图,则结点的出度为该结点边表的长度,计算入度则要遍历整个邻接表
邻接表不唯一,边表结点的顺序根据算法和输入的不同可能会不同
十字链表有向图的一种链式存储结构
data:数据域, firstarc :指向边表的头指针
firstin\firstout:出边和入边单链表的头指针
tailvex\headvex :该弧弧弧头和弧尾端点
hlink/tlink弧头/尾相同的下一个结点指针
info:权值
#define MaxvertexNum 100
typedef struct ArcNode {
int tailvex, headvex;
struct ArcNode *hlink,*tlink;
/ /InfoType info;
}ArcNode;
typedef struct Vode {
//顶点表
vertexType data;
ArcNode *firstin,*firstout;
}VNode;
typedef struct{
//十字链表
vNode xlist[MaxvertexNum];
int vexnum,arcnum;//顶点数量 边的数量
}GLGraph;
firstedge:边表单链表的指针
ivex:该边表第一个端点
ilink:与该端点相邻的下一个边表的指针
jvex:第二个端点
jlink:第二个端点相邻的下一个边表的指针
info:权值
mark:标记
define MaxvertexNum 100
typedef struct ArcNode{
//边表
int ivex, jvex;
struct ArcNode *ilink,*jlink;
/ /InfoType info;
/ /bool mark;
)ArcNode;
typedef struct VNode{
//顶点表结构体
vertexType data;
ArcNode *firstedge ;
vNode;
typedef struct{
//临接多重表
vNode adjmulist[MaxvertexNum];
int vexnum, arcnum;
}AMLGraph;