邻接表
是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。因此,找到一种数组与链表相结合的存储方法称为邻接表。
邻接表的处理方法是这样的:
- (1)图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便。
- (2)图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。
例如,下图就是一个无向图的邻接表的结构。
从图中可以看出,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。
对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。如下图所示。
代码实现邻接表(有向邻接表图) 基于C++
/**
* C++: 邻接表图
*
* @author lph
*
*/
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
// 邻接表
class ListDG {
private: // 内部类
// 邻接表中表对应的链表顶点
class ENode {
public:
int ivex; // 该边所指向的顶点的位置
ENode* nextEdge; // 指向下一条弧的指针
};
// 邻接表中表的顶点
class VNode {
public:
char data; //顶点信息
ENode* firstEdge; //指向第一条依赖该顶点的弧
};
private: // 私有成员
int mVexNum; //图的顶点的数目
int mEdgNum; //图的边的数目
VNode mVexs[MAX]; //用一维数组来存储邻接表的顶点
public:
// 创建邻接表对应的图(自己输入)
ListDG();
// 创建邻接表对应的图(用已经提供的数据)
ListDG(char vexs[], int vlen, char edges[][2], int elen);
~ListDG();
// 打印邻接表图
void print();
private:
// 读取一个输入字符
char readChar();
// 返回ch的位置
int getPosition(char ch);
// 将node