図ストレージ構造は、隣接行列、隣接リスト、隣接リストとクロス複数のテーブルを使用しています。
- 図配列表記 - 隣接行列
論理構造は、頂点データを格納する一次元アレイを使用することが可能である、頂点要素である、頂点のセットと二つの部分のエッジの組に分かれており、その関連する2つの頂点のエッジによって表される、すなわち、側要素が有しています2つのデータフィールド、それはマトリックスと隣接する頂点(すなわち、エッジまたは円弧)との関係を記憶することができる、二次元アレイはまた、隣接行列として知られています。2つの頂点が連結されている場合には、行列の値は、そうでなければ1、0と呼ぶことができます。
隣接行列の定義
(1)無向隣接行列
(2)有向グラフ隣接行列
隣接行列(3)ネットワーク
データ構造記述子隣接行列
(1)構成の説明
#define VERTEX_NUM 6 //图的顶点数
#define VERTEX_MAX_NUM 64 //图的最大顶点数
#define EDGE_MAX_NUM 20 //图的最大边数
typedef char VexType; //顶点的数据类型
typedef int InfoType; // 弧(边)的类型,如权值、边存在或不存在等
隣接行列隣接行列 - AM
typedef struct
{ VexType VertexArray[VERTEX_NUM]; //顶点数组
InfoType AdjMatrix [VERTEX_NUM][ VERTEX_NUM]; //邻接矩阵
} AM_Graph;
隣接行列の複雑さの(2)分析
2. 辺縁アレイ表記
(1)アレイ側のデザイン
エッジは端のエッジの開始点を格納する、情報をすべてのエッジ(または弧)の専用メモリマップアレイを設定する(無向グラフのエッジは、開始または終了点のいずれかの端部で選択されてもよいです)情報(例えば、重量)側、アレイ内の辺の順序は、任意に、特定の要件に応じて、配置することができます。頂点情報、一次元アレイの必要性VERTEX_NUM要素を格納します。
(2)アレイ(Edgesetアレイ)のエッジは、データ構造に記載さ
typedef struct //边集数组单元结构
{ VexType from_vex; //起点
VexType end_vex; //终点
InfoType weight; //权值项可以根据需要设置
} EdgeStruct;
EdgeStruct EdgeSet[EDGE_MAX_NUM]; //边集数组
(3)アレイのエッジの分析の複雑
3 図のリンクリスト表現。1--隣接テーブル
容易に直感的に図自体の構造は、それぞれ頂点隣接行列のサイズを変更する必要が追加または削除、問題解決の過程で動的に生成する必要がある場合、これは明らかに非常に低い効率であること。理解隣接行列配置 また、メモリセルの数は、図の疎の頂点対向するエッジの数が少ないためにかかわらず、数縁(円弧)の、関連図面内の頂点の数と、この無駄なストレージスペースよりのみ隣接行列を占有します大規模な。
(1)邻接表的存储结构设计
对图的每个顶点建立一个单链表( n 个顶点建立 n 个单链表),第 i 个单链表中的结点包含顶点 Vi 的所有邻接结点。
对 n 个同类单链表并行管理,是采用“带行向量的链表表示方法”,这种存储结构称为邻接表。邻接表由头结点表和邻接结点链表两部分组成。
无向图邻接表
对于无向图来说,使用邻接表进行存储也会出现数据冗余,头结点 V1 所指链表中存在一个指向 V4 的邻接结点的同时,头结点 V4 所指链表也会存在一个指向 V1 的邻接结点。
有向图邻接表(出边表)
逆邻接表(入边表)
有时为了便于确定顶点的入度或以顶点为弧头的弧,可以建立一个有向图的逆邻接表。
带权邻接表
数据结构与邻接表基本一致,只在邻接结点中增加一个记录边的权值的数据域。
(2)邻接表数据结构描述
邻接表Adjacency List——AL
typedef struct AdjNode //邻接结点结构
{
int adjvex; //邻接点
AdjNode *next; // 邻接点指针
} AL_AdjNode;
typedef struct //邻接表顶点结点结构
{
VexType vertex; //顶点
AdjNode *link; // 邻接点头指针
} AL_VexNode;
typedef struct //总的邻接表结构
{
A_VexNode VexList[VERTEX_MAX_NUM]; //顶点表
int VexNum, ArcNum; //顶点数,弧(边)数
} AL_Graph;
建立邻接表
/*==========================================
函数功能:建立邻接表
函数输入:无
函数输出:无
共享数据:图的邻接矩阵
=============================================*/
void Create_AdjList()
{
AL_VexNode VexList[N]={0,NULL}; //顶点表
int j;
AL_AdjNode *Ptr,*nextPtr;
?
for(int i=0; i<N; i++)
{
VexList[i].vertex=i;
VexList[i].link=NULL;
j=0;
while(j<N)
{
if (AdjMatrix[i][j]!=0)//有邻接点
{
Ptr=(AL_AdjNode*)malloc(sizeof(AL_AdjNode));
Ptr->adjvex=j;
Ptr->next=NULL;
if (VexList[i].link==NULL)//首次加入邻接点
{
VexList[i].link=Ptr;
nextPtr=Ptr;
}
else
{
nextPtr->next=Ptr;
nextPtr=Ptr;
}
}
j++;
}
}
}
邻接表的空间复杂度分析
4. 十字链表
图的十字链表是有向图的另一种链式存储结构。该结构以入弧和出弧为线索,将有向图的邻接表和逆邻接表结合起来得到的,有顶点表和边表组成。十字链表结构也可以理解为将行的单链表和列的单链表结合起来存储稀疏矩阵,每个结点表示一个非零元素。
在十字链表中,对应于有向图中每一条弧都有一个弧结点,对应于每个顶点也有一个顶点结点。
十字链表复杂度分析
5. 邻接多重表
同様に、隣接するマルチテーブル記憶構造とリンクされたリストを横断するだけでなく、頂点によって、テーブルのテーブルエッジ、隣接するマルチテーブルは、各エッジ情報は、ノード、エッジノードに対応するエッジによって記述されます。接合縁jvex接続位置と接続ivexと結合された2つの関連する頂点ivex縁、jvex外部に加えて、エッジノードの側接合部。
//邻接多重表的顶点结构
typedef struct vnode
{ VexType vertex; //顶点信息
struct node *firstedge; //指向第一条依附于该顶点的边
} AML_VertexNode;
//邻接多重表的顶点表
AML_VertexNode G[VERTEX_NUM];
//邻接多重表的边结点结构
typedef struct node
{ int ivex, jvex; //边的两个关联点
struct node *ilink,*jlink; //分别指向依附于ivex和jvex的下一条边
} AML_EdgeNode;
隣接する複数のテーブルの複雑さの分析
、比較、比較による記憶構造起因ストレージ構造
- ウォッチストレージ構造の頂点
- ストレージ構造関係の辺
- 図ストレージ構造の選択原理