数据结构之 图(一) 图的存储结构

图的存储一般用邻接矩阵或邻接表来存储

  1. 邻接矩阵
    图的存储要考虑两方面的内容,①顶点的信息,②各个顶点之间的边的信息。顶点信息,我们用0 – n-1来表示各个顶点。边的信息用二维数组来表示。其中这个存储边信息的二维数组就是邻接矩阵。代码如下(C++代码):
#define MaxVertexNum 100//设置顶点最大为100个
#define maxn 1000000;
int MGraph[MaxVertexNum];//邻接矩阵,用来存储图
int n;//存储有多少个顶点
int m;//有几条边

下列是创建图的代码:

void CreateMGraph( int MGraph[] ){
	cin>> n >> m;//输入图的顶点数和边数

	for(int i = 0;i <G->e;i++){
		for(int j = 0;j < G->e;j++){
			G->edges[i][j] = maxn;//初始化为无穷大,表示此路不通;
		}
	}
	int a,b,c;
	for(int i = 0;i < G->e;i++){
		cin>>a>>b>>c;//表示从a到b的距离是c
		MGraph[a][b] = c;
		MGraph[b][a] = c;//有这句话创建的是无向图,两边都可以走,若是有向图,则这句话可不写
	}
}
  1. 邻接表
    邻接表的存储是一种顺序存储和链式存储相结合的存储方式,首先用一个数组来存储顶点信息,称为邻接表的表头节点他有两类元素,代码创建如下
typedef struct node{
	int vdata;
	struct node *next;
}VertexNode;

VertexNode Map[MaxVertexNum];//这就是那个邻接表的顶点信息数组

第二个就是表结点,表节点有三类元素,分别是自身data,自己是哪号结点,还有后一个节点的地址,代码如下

typedef struct vnode{
	int data;//表示路径长短
	int Nnode;//表示当前结点是哪个顶点
	struct vnode *next;
}EdgeNode;//这两个的定义其实是一样的,只不过含义不一样

下面来创建邻接表

void CreateALGraph(){
	EdgeNode *s;
	cin>>n>>m;//输入图的顶点数和边数
	int a,b,c;
	for(int i = 0;i < n;i++){
		cin>>a;//输入每个顶点
		Map[i]->vdata = a;
		Map[i]->next = NULL;
	}

	for(int i = 0;i < m;i++){
		cin>>a>>b>>c;
		s = (EdgeNode *)malloc(sizeof(EdgeNode));
		s->Nnode = b;
		s->data = c;

		s->next = Map[a]->next;
		Map[a]->next = s;
	}
}

下一章来说图的遍历

发布了21 篇原创文章 · 获赞 12 · 访问量 408

猜你喜欢

转载自blog.csdn.net/weixin_44415928/article/details/103732458