数据结构 图 的邻接表建立
图 的邻接表建立
如下图
节点A没有指向任何节点
节点B指向A,也指向C,还指向E.
节点C指向E.
节点D指向C.
节点E指向B,也指向C,还指向D.
将其抽象建立为右下的邻接表

typedef struct _EdgeNode {//与节点连接的边的定义int adjvedx; //指向终点顶点的下标int weight; //权重_EdgeNode* next; //下一条边
}EdgeNode;typedef struct _VertexNode { //顶点节点char data; //节点数据_EdgeNode* first; //指向邻接第一条边
}VertexNode,AdjList;typedef struct _AdjListGraph {AdjList* adjlist;int vex; //顶点数int edge; //边数
}AdjListGraph;
在内存中的建立结构如下:

参考程序如下:
Graphs.h
#pragma once
#include <iostream>using namespace std;#define MAXSIZE 10 typedef struct _EdgeNode {//与节点连接的边的定义int adjvedx; //邻接的顶点int weight; //权重_EdgeNode* next; //下一条边
}EdgeNode;typedef struct _VertexNode { //顶点节点char data; //节点数据_EdgeNode* first; //指向邻接第一条边
}VertexNode,AdjList;typedef struct _AdjListGraph {AdjList* adjlist;int vex; //顶点数int edge; //边数
}AdjListGraph;//图的初始化
void Init(AdjListGraph& G);//图的创建(邻接表的创建)
void Create(AdjListGraph& G);//通过顶点对应的字符寻找顶点在顶点列表中的位置
int Location(AdjListGraph& G, char c);//输出构建的邻接表
void printGraphs(AdjListGraph& G);//销毁邻接表
void Destroy(AdjListGraph& G);
Graphs.cpp
#include "Graphs.h"void Init(AdjListGraph& G)
{G.adjlist = new AdjList[MAXSIZE];G.edge = 0;G.vex = 0;
}void Create(AdjListGraph& G)
{cout << "请输入该图的顶点数:" << endl;cin >> G.vex;cout << "请输入该图的边数:" << endl;cin >> G.edge;cout << "请输入相关顶点:" << endl;for (int i = 0; i < G.vex; i++) {cin >> G.adjlist[i].data;G.adjlist[i].first = NULL;}char v1 = 0, v2 = 0; //保存输入的顶点的字符int i1, i2; //保存顶点在数组中的下标cout << "请输入想关联边的顶点(A-->B):" << endl;for (int i = 0; i < G.edge; i++) {cout << "起点-->终点:";cin >> v1 >> v2;i1 = Location(G, v1);i2 = Location(G, v2);if (i1 != -1 && i2 != -1) { //寻找到位置EdgeNode* temp = new EdgeNode;temp->adjvedx = i2; //边指向的顶点位置temp->next = G.adjlist[i1].first; //置空G.adjlist[i1].first = temp; //链接到顶点表上}}
}int Location(AdjListGraph& G, char c)
{for (int i = 0; i < G.vex; i++) {if (G.adjlist[i].data == c) {return i;}}return -1;
}void printGraphs(AdjListGraph& G)
{cout << "邻接表顶点数:" << G.vex << " 邻接表边数:" << G.edge << endl;for (int i = 0; i < G.vex; i++) {cout << "顶点:" << G.adjlist[i].data;EdgeNode* p = G.adjlist[i].first;while (p) {int n = p->adjvedx; //边指向顶点的位置cout << "-->" << G.adjlist[n].data;p = p->next;}cout << endl;}}void Destroy(AdjListGraph& G)
{EdgeNode* p = NULL, * tmp = NULL;for (int i = 0; i < G.vex; i++) {p=G.adjlist[i].first;while (p) {tmp = p;p = p->next;delete tmp;}}delete[] G.adjlist;
}
main.cpp
#include "Graphs.h"int main() {AdjListGraph Graph;Init(Graph);Create(Graph);printGraphs(Graph);Destroy(Graph);system("pause");return 0;
}
输入信息即显示如下

