图的存储

155 阅读2分钟

邻接矩阵法

image.png

#define MaxVertexNum 100	//顶点数目的最大值
typedef struct{
	char Vex[MaxVertexNum];	//顶点表
    int Edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵,边表
    int vexnum,arcnum;	//图的当前顶点数和边数
}MGraph;

无向图 第i个顶点的度=第i行(或第i列)的非零元素个数 有向图 第i个结点的出度=第i行的非零元素个数 第i个结点的入度=第i列的非零元素个数 第i个结点的度=第i行、第i列的非零元素个数之和

邻接矩阵法求顶点的度/出度/入度的时间复杂度为O(|v|)

邻接矩阵法存储带权图(网)

image.png

#define MaxVertexNum 100	//顶点数目的最大值
#define INFINITY 最大的int值		//宏定义常量“无穷”
typedef char VertexType;	//顶点的数据类型
typedef int EdgeType;		//带权图中边上权值的数据类型
typedef struct{
    VertexType Vex[MaxVertexNum];	//顶点
    EdgeType Edge[MaxVertexNum][MaxVertexNum];	//边的权
    int vexnum,arcnum;	//图的当前顶点数和弧数
}MGraph;

空间复杂度:O(|V|的2次方)--只和顶点数相关,和实际的边数无关 适合用于存储稠密图 无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)

邻接矩阵法的性质

image.png

邻接表法

邻接表法(顺序+链式存储) image.png

//边
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; 
邻接表邻接矩阵
空间复杂度无向图O(|V|+2|E|);有向图O(|V|+|E|)O(|V|的2次方)
适合用于存储稀疏图存储稠密图
表示方式不唯一唯一
计算度/出度/入度计算有向图的度、入度不方便,其余很方便必须遍历对应行或列
找相邻的边找有向图的入边不方便,其余很方便必须遍历对应行或列

十字链表存储有向图

image.png 空间复杂度:O(|V|+|E|) V:顶点个数 E:边条数 顺着绿色线路找指定顶点的所有出边 顺着橙色线路找指定顶点的所有入边 十字链表只用于存储有向图

邻接多重表存储无向图

image.png 空间复杂度:O(|V|+|E|) 删除边、删除节点等操作很方便 注意:邻接多重表只适用于存储无向图 image.png