严蔚敏视频 笔记25
基本操作P
结构的建立和销毁
CreateGraph(&G,V,VR);
DestroyGraph(&G);
对顶点的访问操作
LocateVex(G,u); // 定位操作
GetVex(G,v); // 返回v值
PutVex(&G,v,value); // 对v赋值value
对邻接点的操作
FirstAdjVex(G,v); // 返回v的第一个邻接点
NextAdjVex(G,v,w) // 返回v相对于w的下一个邻接点
插入和删除顶点
InsertVex(&G,v);
DeleteVex(&G,v);
插入和删除弧
InsertArc(&G,v,w);
DeleteArc(&G,v,w);
遍历
DFSTraverse(G,v,Visit()); // 深度优先
BFSTraverse(G,v,Visit()); // 广度优先
7.2 图的存储表示
一、图的数组(邻接矩阵)存储表示
typedef struct ArcCell {
VRType adj; // VRType:顶点关系类型 无权图用01表示是否相邻,带权图为权值类型
InfoType *info; // 该弧相关信息指针
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vex[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
} MGraph;
二、图的邻接表存储表示
typedef struct ArcNode {
int adjvex; // 该弧指向顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
InfoType *info; // 该弧相关信息的指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum,arcnum;
int kind; // 图的种类标志
} ALGraph;
有向图的邻接表及逆邻接表
三、有向图的十字链表存储表示
typedef struct ArcBox {
int tailvex,headvex; // 该弧的尾和头顶点的位置
struct ArcBox *hlink,*tlink; // 分别指向下一个弧头相同和弧尾相同的弧的指针域
InfoType *info; // 该弧相关信息的指针
} ArcBox;
typedef struct VexNode {
VertexType data;
ArcBox *firstin,*firstout;
} VexNode;
typedef struct {
VexNode xlist[MAX_VERTEX_NUM];
int vexnum,arcnum; // 有向图的当前顶点数和弧数
} OLGraph;
十字链表对应相应邻接矩阵
四、无向图的邻接多重表存储表示
typedef struct EBox {
VisitIf mark; // 访问标记
int ivex,jvex; // 该边依附的两个顶点的位置
struct EBox *ilink,*jlink;
InfoType *info; // 该边信息指针
} EBox;
typedef struct VexBox {
VertexType data;
EBox *firstedge; // 指向第一条依附该顶点的边
} VexBox;
typedef struct {
VexBox adjmulist[MAX_VERTEX_NUM];
int vexnum,edgenum;
} AMLGraph;
7.3 图的遍历
从某个顶点出发访遍图中其余顶点并且每个顶点只被访问一次
深度优先搜索