对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表,即数组与链表相结合的存储方法。

邻接表的处理方法是这样的。

1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。

表示方法如下:


数据结构 图的邻接矩阵表示法_Graphic

#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;
}