图的链式存储:
图的链式存储有多种,有邻接表、十字链表和邻接多重表,下面注意说明邻接表。
邻接表:
邻接表由两部分组 成:表头结点表和边表。
例:
深度优先遍历:
为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。 为此,设一 个辅助数组visited[n] , 其初始值置为"false"或者0, 一旦访问了顶点V, 便置visited[i]为"true" 或者1。
以该图为例:
代码如下:
#include<stdio.h>
#define MVNum 100
typedef char OtherInfo;
typedef char VerTexType;
//邻接表存储结构
typedef struct ArcNode //边结点
{
int adjvex;
struct ArcNode *nextarc;
OtherInfo info;
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data;
ArcNode *firstarc;
}VNode, AdjList[MVNum];
typedef struct //邻接表
{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
int LocateVex(ALGraph G, char v);
void LinkAL(ALGraph &G, int i, int j);
//邻接表创建无向图
void CreateUDG(ALGraph &G)
{
G.vexnum = 8; //输入总顶点数和边数
G.arcnum = 9;
G.vertices[0].data = 'v1'; //输入顶点信息
G.vertices[0].firstarc = NULL;
G.vertices[1].data = 'v2';
G.vertices[1]