図 - 隣接関係テーブルの実装

隣接リストとは何ですか?

図隣接行列貯蔵の実施例ので、そのようなものの頂点として固定オープンスペースが、いくつかの側面、隣接行列の未使用スペースのような多数を必要とします。同時に、ファッションのアレイを使用して、便利なクエリを横断するが、時には必要な追加および削除操作が、それはより面倒で時間を消費することになります。これまで隣接テーブルから出て、以来、単鎖+的連結ストレージアレイの使用。比較的柔軟Aロット。頂点アレイ、エッジ関連付けられた頂点の単一リンクリスト格納対応するセットを記憶します。

どのように達成するために?

この定義によると、我々は定義することができますヘッドノード

データ firstarc

ヘッドノードは、アレイの基本的な要素を定義します。

次に定義しますテーブルノード

adjvex nextarc

頂点情報は、直接的または間接的に、データフィールドの配列内の頂点の添え字番号が格納されます。頂点関連するエッジ情報を格納する変数ノードテーブルのアプリケーションタイプが存在する場合、テーブル・ノード(示さサイド情報)テーブルの縁部に対応する頂点に挿入しました。ここでは、尾が頭の真ん中に挿入することができ、挿入操作を実装する方法を検討する必要がありますが、確かに直接頭の中に挿入されました、最初のノードが、最も便利なものである後に元のノードの前に最初のテーブルであり、どの時間計算量はO(1)

firstarcヘッドノードテーブルは、ノードポインタを型へのポインタであるため、実際に順序を調整するため、必要、テーブルが最初にノードを定義すべきです。

実現するために始めました

そのようなアレイ+配列要素ボックスと呼ばれる単一のリンクリスト、ハッシュテーブル、及び以下の説明借りハッシュテーブルに幾分類似しています。

#define MAXVEX 20	//最大顶点数

//定义边表结点
typedef struct _ArcNode
{
	int adjvex;//当前数组盒子指向顶点的位置
	struct _ArcNode * nextarc;//指向当前数组盒子下一条边的指针
}ArcNode;

//定义表头结点
typedef struct _VNode
{	
	int data;//可以利用这个data域存储某个数组盒子的边表长度以指示边数量
	ArcNode * firstarc;//指向这个盒子的第一条边
}VNode;

//定义图
typedef struct _Graph
{
	int vexnum,arcnum;//顶点数目,边数目
	VNode vexs[MAXVEX];
}Graph;

これは、関連するグラフの隣接テーブルの実装の定義を完了します。初期化を達成するために、その後側の情報、および書き込み操作。

//将顶点数组创建完成,并存储汇总信息
void CreateGraph(Graph * G, int vexnum, int arcnum)
{
	G->vexnum = vexnum;
	G->arcnum = arcnum;
	for (int i = 0; i < MAXVEX; ++i)
	{
		(G->vexs[i]).firstarc = NULL;
		(G->vexs[i]).data = 0;
	}
}

//定义一个边结构,方便插入操作
typedef struct _Edge
{
	int v1,v2;//v1出发点编号,v2终点编号,可依据有向或是无向具体化
	WeightType weight;//边权值,可选
}Edge;

//将边信息以边表结点的形式插入到对应的盒子
void InsertEdge(Graph * G, Edge E)
{
	//申请边表结点空间
	ArcNode * arc = (ArcNode *) malloc (sizeof(ArcNode));
	arc->adjvex = E->v2;
	arc->nextarc = NULL;

	//插入到边表中
	if((G->vexs[E->v1]).data == 0)
		(G->vexs[E->v1]).firstarc = arc;
	else{
		arc->nextarc = (G->vexs[E->v1]).firstarc;
		(G->vexs[E->v1]).firstarc = arc;
	}

	//成功插入,对应盒子的边表结点数量自增
	(G->vexs[E->v1]).data += 1;
}

概要

  1. 上記で定義した鎖状構造が、図2に対応する、特定のコンフィギュレーションを格納する際に、有向グラフを区別しないそれぞれの要求に対応するための変更かどうかを行います。
  2. 例えば、そのような隣接テーブルは、記憶装置は、二つの側面が、実際には、完全に不要で、エッジノードを発現して、我々は、ある同じ側上に格納された情報を繰り返すことグラフを無向。無向グラフのために、それを最適化するために、次に情報記憶側の重複を避けるために、隣接するマルチテーブルを生成します。
  3. このようなテーブル構造のエッジリストは、度のみ対応するアークテーブル頂点であるので、侵入の対応する頂点を知るために、図に格納され、頂点に他の頂点が存在するかどうかを決定するために、テーブルのアレイ全体ボックス+側を横断する必要があります、程度を決定するプロセスである、これは非常に面倒です。最適化するために行われる有向グラフについては、次に頂点の程度を調べるために、クロスリンクされたリストを生成し、容易。
  4. 実際には、時々、そのような鎖は、記憶空間セーブ、例えば図の密集、エッジアレイテーブルポインタフィールドと複数の側ノードテーブルの場合に匹敵するテーブルに格納される情報の量は、Vを必要と増加しないことがありヘッドノード、2Eテーブルノードは、倍以上の記憶容量と同等のものを使いました。しかし、図の疎側が比較的小さい場合には、ビューの省スペースの点から、隣接リストの使用は、より良好な表すことになります。
公開された21元の記事 ウォンの賞賛4 ビュー1101

おすすめ

転載: blog.csdn.net/GuoningningPro/article/details/104034666