一、什么是邻接表
- 图的邻接表存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。
- 如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。表结点存放的是邻接顶点在数组中的索引。
- 对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。
二、如何用邻接表建无向图

定义表头结点
typedef struct VNode {
ArcNode *fstArc;
string data;
}AdVList;
定义边表节点
typedef struct ArcNode {
int adv;
struct ArcNode *nextArc;
int data;
}ArcNode;
定义图
typedef struct ALGraph {
AdVList Vts[MNum];
int Vrnum, arnum;
};
创建无向图的邻接表
void CreateGraph(ALGraph &G)
{
string v1, v2;
cout << "输入图的顶点数和边数:\n";
cin >> G.Vrnum >> G.arnum;
for (int i = 0; i < G.Vrnum; i++)
{
cout << "输入第" << i + 1 << "个顶点的信息\n";
cin >> G.Vts[i].data;
G.Vts[i].fstArc = NULL;
}
for (int i = 0; i < G.arnum; i++)
{
cout << "输入第" << i + 1 << "条边的起点和终点\n";
cin >> v1 >> v2;
int j, k;
j = find(G, v1);
k = find(G, v2);
ArcNode *p1 = new ArcNode;
ArcNode *p2 = new ArcNode;
p1->adv = k;
p1->nextArc = G.Vts[j].fstArc;
G.Vts[j].fstArc = p1;
p2->adv = j;
p2->nextArc = G.Vts[k].fstArc;
G.Vts