
邻接表(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#include 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 < > G.vexnum >> G.edgenum; cout << "请输入顶点的信息" < > 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; }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)