当前位置:
文档之家› 数据结构 耿国华 西北大学 7-2图的存储结构
数据结构 耿国华 西北大学 7-2图的存储结构
15
9
11
B
E
7 21
3
C2 D
1A 2B 3C 4D 5E
2 15 5 9 ∧ 3 3∧ 4 2∧ 1 11 2 7 ∧ 3 21 ∧
13
第7章 图
7.2图的存储结构
②图的邻接表表示法(链式存储法)形式化描述
#define MAX_V 20
#define enum {DG,DN,UDG,UDN} GraphKind;
Ⅱ.
OD(vi)=第i个单链表上结点的个数
有向图(网):
ID(vi)扫描整个邻接表
逆邻接表
15
第7章 图
7.2图的存储结构 ②图的邻接表表示法(链式存储法)逆邻接表
有向图 A
B
E
C
D
1A 2B 3C 4D 5E
4∧
1
4∧
2
5∧
3∧
1∧
16
第7章 图 7.2图的存储结构 ③有向图的十字链表表示法(链式存储法)
}ArcNode;
typedef struct
{
VertexNode vertex[MAX_V];
int vexnum, arcnum; 14 GraphKind kind;
}AdjList;
第7章 图 7.2图的存储结构 ②图的邻接表表示法(链式存储法)特点:
Ⅰ.无向图存储空间:n+2e
无向图:TD(vi)= 第i个单链表上结点的个数
typedef struct ArcNode
{
int tailvex,headvex;
struct ArcNode *hlink,*tlink;
InfoType *info;
}ArcNode;
typedef struct VertexNode
{
VertexData data;
ArcNode *firstin,*firstout;
二维数组:用于存储图中顶点之间关联关系 邻接矩阵
1 若<vi,vj>或(vi,vj)VR
A[i,j]=
0 反之
有向图 A
A BCD E A 01 00 1 非
B 00 10 0 对
B
E
C 00 01 0 称
3
D 11 00 0 矩
CD
E 00 10 0 阵
第7章 图
7.2图的存储结构
①图的邻接矩阵表示法(数组表示法)
A[i,j]=
0 反之
无向图 BC
A
D
FE
A BCD E F
A 01 00 1 0
B 10 00 1 1 对
C 00 01 0 1 D 00 10 0 1 E 11 00 0 0
称 矩 阵
2
F 01 11 0 0
第7章 图
7.2图的存储结构
①图的邻接矩阵表示法(数组表示法)
一维数组:用于存储顶点信息。
边的结点结构 mark ivex ilink jvex jlink
顶点的结点结构 data firstedge
20
第7章 图 7.2图的存储结构 ④无向图的邻接多重表表示法
无向图
A
B
C
D
E
1A 2B 3C 4D 5E
12
1 4∧
32
34
5 2∧
3∧ 5 ∧
21
返回
2、求顶点的度
j=1n
OD(vi)= ∑A[ i,j ]
有向图(网):
j=1 n
3、FirstAdjVertex(G,v)
ID(vi)= ∑A[ j,i ] j=1
a、找v在G.Vertex[ ]中的下标i 9
b、找G.arc[i][ ]中第一个非零分量的列下标j c、 j或者G.Vertex[j]中的信息即为所求
}VertexNode;
typedef struct
{
VertexNode vertex[MAX_VERTEX_NUM];
19
int vexnum,arcnum;
GraphKind kind;
}OrthList;
第7章 图
7.2图的存储结构 ④无向图的邻接多重表表示法
顶点和边分别各用一种存储结构的结点表示。依附于相同 顶点的边被链在同一链表上,每条边依附于两个顶点,所 以每个边结点同时被链接在两个链表中,链表的头结点就 是顶点结点。同时还在边结点中增加了一个访问标志位。
一维数组:用于存储顶点信息。
二维数组:用于存储图中顶点之间关联关系 邻接矩阵
A[i,j]=
有向网
1wij 若<vi,vj>或(vi,vj)VR
0∞ 反之
A BCD E
15 A 9
11
B
E
7 21
3
C2 D
A ∞ 15 ∞ ∞ 9 非
B ∞∞ 3 ∞∞ 对
C ∞∞ ∞ 2 ∞ 称
D 11 7 ∞ ∞ ∞ 矩
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vertex[i]); /* 输入图的顶点*/
for(k=0;k<G->arcnum;k++)
{ scanf("%c,%c,%d",&v1,&v2,&weight);
/*输入一条弧的两个顶点及权值*/
i=LocateVex (G,v1);
第7章 图
7.2图的存储结构 ②图的邻接表表示法(链式存储法)
对图中每个顶点建立一个单链表,第i个 单链表中的结点表示依附于顶点vi的边。
Ⅰ.表头结点 data firstarc
Ⅱ.表结点 图 网
adjvex nextarc adjvex info nextarc
10
第7章 图 7.2图的存储结构 ②图的邻接表表示法(链式存储法)
顶点和弧分别各用一种存储结构的结点表示。弧头 相同的弧被链在同一链表上,弧尾相同的弧也被链 在同一链表上,链表的头结点就是顶点结点。
弧的结点结构 tailvex headvex hlink tlink
顶点的结点结构 data firstin firstout
17
第7章 图
7.2图的存储结构
③有向图的十字链表表示法
无向图 BC
A
D
FE
1A
2
5∧
2B
1
5
6∧
3C
4
6∧
4D
3
6∧
5E
1
2∧
6F
2
3
4∧
11
第7章 图
7.2图的存储结构 ②图的邻接表表示法(链式存储法)
有向图 A
B
E
C
D
1A 2B 3C 4D 5E
2
5∧
3∧
4∧
1
2∧
3∧
12
第7章 图 7.2图的存储结构 ②图的邻接表表示法(链式存储法)
有向网
A
4
E ∞ ∞ 21∞ ∞ 阵
第7章 图
7.2图的存储结构
①图的邻接矩阵表示法(数组表示法)形式化描述
#define MAX_V 20
#define INFINITY 32768
typedef enum{DG,DN,UDG,UDN} GraphKind;
typedef char VertexData;
int CreateDN(AdjMatrix *G) /*创建一个有向网*/ { int i,j,k,weight; VertexData v1,v2; scanf("%d,%d",&G->arcnum,&G->vexnum); for(i=0;i<G->vexnum;i++) for(j=0;j<G->vexnum;j++) G->arcs[i][j].adj=MAX;
第7章 图 7.2图的存储结构
①图的邻接矩阵表示法 ②图的邻接表表示法 ③有向图的十字链表表示法 ④无向图的邻接多重表表示法
1
第7章 图
7.2图的存储结构
①图的邻接矩阵表示法(数组表示法)
一维数组:用于存储顶点信息。
二维数组:用于存储图中顶点之间关联关系 邻接矩阵
1 若<vi,vj>或(vi,vj)VR
typedef struct ArcNode typedef struct Vertex struct ArcNode *nextarc; OtherInfo info;
VertexData data; ArcNode *firstarc; }VertexNode;
5
}AdjMatrix;
创建邻接矩阵存储的有向网
int LocateVex(AdjMatrix * G, VertexData v) { int j=Error,k;
for(k=0;k<G->vexnum;k++) if(G->vertex[k]==v) { j=k; break; }
return(j); }
Ⅰ.存储空间 无向图(网) :n(n-1)/2 有向图(网):n2
注意:稀疏图不适于用邻接矩阵来存储,因为这样 会造成存储空间的浪费。
8
第7章 图
7.2图的存储结构
①图的邻接矩阵表示法(数组表示法)特点:
Ⅱ.便于运算
1、判断图中任意两个顶点之间是否有边相连。
n
无向图(网) :TD(vi)= ∑A[ i,j ]
j=LocateVex (G,v2);