. 2.边表采用链表结构。
*/
class GraphAdjList
{
/*
. 边表(链表)结点
*/
struct ArcNode
{
int adjVex; //邻接顶点所在表中下标
int weight; //边权重
ArcNode * next; //下一条边
};
/*
. 顶点表(顺序表)结点
*/
struct VNode
{
string name; //顶点名
ArcNode * first; //指向的第一个依附该顶点的顶点边结点
};
public:
/*
. 图 种类
*/
enum GraphType
{
DG, //有向图,默认 0
UDG, //无向图,默认 1
DN, //有向网,默认 2
UDN //无向网,默认 3
};
/*
. 边(弧)数据,注:供外部初始化边数据使用
*/
struct ArcData
{
string Tail; //弧尾
string Head; //弧头
int Weight; //权重
};
private:
static const int _MAX_VERTEX_NUM = 10; //支持最大顶点数
VNode vexs[_MAX_VERTEX_NUM]; //顶点表
int vexs_visited[_MAX_VERTEX_NUM]; //顶点访问标记数组:0|未访问 1|已访问
int vexNum; //顶点数
int arcNum; //边数
int type; //图种类
void _CreateVexSet(ObjArrayList<string> * vexs); //创建顶点集合
void _CreateDG(ObjArrayList<ArcData> * arcsList); //创建有向图
void _CreateUDG(ObjArrayList<ArcData> * arcsList); //创建无向图
void _CreateDN(ObjArrayList<ArcData> * arcsList); //创建有向网
void _CreateUDN(ObjArrayList<ArcData> * arcsList); //创建无向网
int _Locate(string vertex); //定位顶点元素位置
void _InsertArc(int tail, int head, int weight); //插入边(元操作,不分有向/无向)
void _DeleteArc(int tail, int head); //删除边(元操作,不分有向/无向)
void _DFS_R(int index); //深度优先遍历 递归
void _DFS(int index); //深度优先遍历 非递归
public:
GraphAdjList(int type); //构造函数:初始化图种类
~GraphAdjList(); //析构函数
void Init(ObjArrayList<string> * vexs, ObjArrayList<ArcData> * arcsList); //初始化顶点、边数据为 图|网
void InsertArc(ArcData * arcData); //插入边(含有向/无向操作)