1.图的物理结构
一.邻接矩阵存储稠密图
用于存储无向图,有向图,总之各类图
优缺点:适合存储稠密图,属于上下三角矩阵,有重复
复杂度:O(V),空间O(V^2)
性质:阶乘得到某一点的值,为顶点到另外一个顶点的长度为阶乘数的数目,
很容易类比得到
//存储无向图
#define MaxVertexNum 100
typedef struct{
char Vex[MaxVertexNum];//顶点数
int Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵
int vexnum,arcnum;//顶点数,弧数
}MGraph;
//存储带权图
#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;
二.邻接表存储稀疏图
边节点的数目:2|E|,因为有重复,比较适合存储稀疏图
优缺点:对于有向图不友好,整体时间复杂度 O(|V|+2|E|)
//1.顶点结构
typedef struct VNode{
VertexType data; //顶点的信息
ArcNode *first; //第一条边/弧
}VNode,AdjList[MaxVertexNum];
//2.边
typedef struct{
int adjvex;
struct ArcNode *next;
//InfoType info; //边的权值
}ArcNode;
//3.邻接表的结构
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
三.十字链表存储有向图
代码实现:
代码实现十字链表法
//边界点结构体
struct Node{
int from;
int to;
struct Node* in_pointer;
struct Node* out_pointer;
}
//十字链表法结构
struct Cross_List
{
int vex;
int edge;
struct{
char hede_ele;
struct Node* in_pointer;
struct Node* out_pointer;
}
}
四. 临接多重表存储无向图
2.图的基本操作
主要实现方式再于邻接表与邻接矩阵,并且可以分析判断时间复杂度
1.判断边是否存在
Adjacent(G,x,y);
2.列出图结点邻接的边
Neighbors(G,x);
3.插入新节点
InsertVertex(G,x);
4.删除图的某一顶点
DeleteVertex(G,x);
5.添加图的一条边
AddEdge(G,x,y);
6.(重要)找到图中顶点的第一个邻接点
FirstNeighbor(G,x);
7.(重要)找到图中除y的下一个邻接点
NextNeighbor(G,x,y);
8.获取某条边的权值
Get_edge_value(G,x,y);
9.设置某条边的权值
Set_edge_value(G,x,y,v);