概述
邻接表(Adjacency List)是图的一种链式存储方法。邻接表包含两部分:顶点和邻接点。顶点包括顶点信息和指向第一个邻接点的指针,邻接点是包括邻接点的存储下标和指向下一个邻接点的指针。顶点v的所有邻接点构成一个单链表。
tips:说人话就是用一个一维数组,每个位置存放一个单链表的头结点,这个头结点有数据域和指向下一个节点(邻接点)的指针域.
图解如下
代码分析
由上图,我们可以设计3个结构体,分别表示 邻接点 ,节点, 图
const int maxnum = 100;
struct AdjNode
{
int v;//邻接点下标
struct AdjNode* next;
};
struct VexNode
{
VexType data; //顶点
AdjNode* first; //指向下一个邻接点
};
struct ALGragh
{
VexNode Vex[maxnum]; //顶点集
int vexnum, edgenum; //顶点数,边数
};
为了表示顶点与顶点之间有关系,我们将用Vex[maxnum]记录先输入的顶点,那么该顶点所有关系的邻接点(后输入的)将用头插法的方式插入到该顶点的后面,并且用记录后输入的节点的下标来表示
插入代码如下(简单的链表头插法)
void insert_edge(ALGragh& G, int i, int j)
{
AdjNode* s;
s = new AdjNode;
s->v = j;
s->next = G.Vex[i].first;
G.Vex[i].first = s;
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
typedef char VexType;
const int maxnum = 100;
struct AdjNode
{
int v;//邻接点下标
struct AdjNode* next;
};
struct VexNode
{
VexType data;
AdjNode* first;
};
struct ALGragh
{
VexNode Vex[maxnum];
int vexnum, edgenum;
};
int locate_vex(ALGragh G, VexType x)
{
for (int i = 0; i < G.vexnum; i++)
{
if (x == G.Vex[i].data)
{
return i;
}
}
return -1;
}
void insert_edge(ALGragh& G, int i, int j)
{
AdjNode* s;
s = new AdjNode;
s->v = j;
s->next = G.Vex[i].first;
G.Vex[i].first = s;
}
void print(ALGragh G)
{
for (int i = 0; i < G.vexnum; i++)
{
AdjNode* t = G.Vex[i].first;
cout << G.Vex[i].data << ":";
while (t)
{
cout << "[" << t->v << "] ";
t = t->next;
}
cout <<endl;
}
}
void CreateALGraph(ALGragh& G)
{
VexType u, v;
cout << "请输入顶点的数目和边数" << endl;
cin >> G.vexnum >> G.edgenum;
cout << "请输入顶点的信息" <<endl;
for (int i = 0; i < G.vexnum; i++)
{
cin >> G.Vex[i].data;
G.Vex[i].first = nullptr;
}
cout << "请依次输入每两条边所依附的两个顶点" << endl;
while (G.edgenum--)
{
cin >> u >> v;
int i = locate_vex(G, u);
int j = locate_vex(G, v);
if (i != -1 && j != -1)
{
insert_edge(G, i, j);
}
else
{
cout << "输入顶点信息错误!请重新输入" << endl;
G.edgenum++;
}
}
}
int main()
{
ALGragh G;
CreateALGraph(G);
print(G);
system("pause");
return EXIT_SUCCESS;
}