图的两种存储
一·邻接矩阵:
1.含义:
- 图的邻接矩阵表示2点是否连通;
- 网(带权图)的邻接矩阵表示2点间的权值
2.特点:
- 无向图有对称性,可以只存储右上三角或者左下三角的矩阵元素
- 无向图的di(行/列)非0元素是di个顶点的度
- 有向图的di行非0元素是di个顶点的出度(行出)
- 有向图的di列非0元素是di个顶点的入度(列入)
3.创建代码:
邻接矩阵的定义与创建:
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define INF 50000
typedef int ElemType;
typedef struct{
ElemType vexs[MAXSIZE]; //定点表
int arcs[MAXSIZE][MAXSIZE]; //矩阵
int arcnum; //边数
int vexnum; //点数
}Graph;
void CreateGraph(Graph &G){
int i,j,k,w;
cin>>G.vexnum>>G.arcnum;
//vexs list:
for(i=0;i<G.vexnum;i++)
cin>>G.vexs[i];
//Init:
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++){
G.arcs[i][j]=INF;
}
//Create:
for(k=0;k<G.arcnum;k++){
cin>>i>>j;//图
cin>>i>>j>>w;//网
G.arcs[i][j]=1;G.arcs[j][i]=1;//无向图
G.arcs[i][j]=w;G.arcs[j][i]=w;//无向网
G.arcs[i][j]=1;//有向图
G.arcs[i][j]=w;//有向网
}
}
二·邻接表:
1.结构:
头结点(顺序),表结点(链式)
2.特点:
- 图的邻接表不唯一,单链表顺序可能不同,邻接表取决于创建算法与输入顺序。
- 无向图所需边的存储空间是有向图的2倍,邻接表相比邻接矩阵省空间。
- 假设顶点为vi。对于无向图,顶点单链表的表结点数目就是该顶点的度;对于有向图,表节点数目是vi的出度,adjvex/tarvex值为i的是vi的入度。
3.创建代码:
#include<iostream>
using namespace std;
#define MAXSIZE 100
//边结点
typedef struct ArcNode{
int adjvex;
int w;//非网可以省略
struct ArcNode * next;
}ArcNode;
//头结点/邻接表
typedef struct VexNode{
int data;
ArcNode * firstarc;
}VexNode,AdjList[MAXSIZE];
//图结构
typedef struct{
AdjList L;
int arcnum;
int vexnum;
}Graph;
void CreateGraph(Graph &G){
int i,j,k;
ArcNode * e;
cin>>G.vexnum>>G.arcnum;
//1)顺序表部分:
for(i=1;i<=G.vexnum;i++){
cin>>G.L[i].data;
G.L[i].firstarc=NULL;
}
//2)链表部分:
for(k=0;k<G.arcnum;k++){
cin>>i>>j;
e = new ArcNode();
e->adjvex = j;
e->next = G.L[i].firstarc;//头插法
G.L[i].firstarc = e; //头插法
//无向图还需要加下面的:
e = new ArcNode();
e->adjvex = i;
e->next = G.L[j].firstarc;//头插法
G.L[j].firstarc = e; //头插法
}
}

浙公网安备 33010602011771号