对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表,即数组与链表相结合的存储方法。
邻接表的处理方法是这样的。
1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。
表示方法如下:
#include<iostream>
#define MAXSIZE 10
using namespace std;
typedef int WeightType;
typedef int Vertex;
typedef int DataType;
//邻接表的表示方法
//图的框架
typedef graphic *PtrToGraphic;
struct graphic
{
int Nv; //顶点的个数
int Ne; //边的条数
adjList G; //邻接表
};
typedef PtrToGraphic LGraphic;
//边的表示
//(1)一个节点包括 边和边所指顶点的编号
typedef AdjVNode *PtrToAdjVnode;
struct AdjVNode
{
Vertex adjNode; //所指顶点的编号
WeightType weight; //边权重
PtrToAdjVnode next; //指向下一个节点
};
//(2)插入用 一个边存有两条节点
typedef AdjEdge *PtrAdjEdge;
struct AdjEdge
{
Vertex V1; //顶点1
Vertex V2; //顶点2
WeightType Weight; //边的权重
};
typedef PtrAdjEdge Edge;
//顶点的表示
typedef struct Vnode
{
PtrToAdjVnode FirstEdge; //在邻接表中 表示第一条边
DataType data;
}adjList[MAXSIZE];
//图的创建
LGraphic createLGraphic(int vertexNum) { //创建一个图
Vertex V, W; //用来遍历
LGraphic Grahic;
Grahic = (LGraphic)malloc(sizeof(struct graphic)); //创建
Grahic->Nv = vertexNum;
Grahic->Ne = 0;
for (V = 0; V < Grahic->Nv; ++V) {
Grahic->G[V].FirstEdge = NULL;
}
return Grahic; //返回图
}
//边的插入
void InsertIntoGraphic(LGraphic Graphic, Edge E) {
PtrToAdjVnode NewNode;
NewNode = (PtrToAdjVnode)malloc(sizeof(struct Vnode)); //赋值
NewNode->weight = E->weight;
NewNode->adjNode = E->V2; //边所指向的顶点
NewNode->next = Graphic->G[E->V1].FirstEdge;
Graphic->G[E->V1].FirstEdge = NewNode;
return;
}