隣接リストのC言語の実装

1.図ストレージ研究で、隣接行列と隣接リストは、隣接テーブルを使用して、2つの一般的に使用されるストレージ図態様は、以下のC言語で実装されています

2.次のように具体的な実施プロセスです。

①まず、ヤンウェイミンバージョンデータ構造を参照することができる構造の一方の側に向け、図文の構造、グラフの頂点の構造とを用いた構成は、特定のデータ構造を書き込みます。

typedef struct ArcNode{
	int adjvex;//该边所指向的节点的位置 
	struct ArcNode *nextarc;
//	边的信息, 例如边的权重 
	int info;
}ArcNode; 

typedef struct{
    //顶点表存储当前顶点的信息
	int data;
    //指向边的指针
	ArcNode *firstarc;
}Vnode; 

typedef struct{
    //顶点数组
	Vnode adjlist[maxSize];
    //图中的顶点的数目和边的数目
	int n, e;
}AGraph

私たちはマップを指すポインタを宣言し、malloc関数は、マップのためのメモリ空間を割り当て、使用する必要があるので、それが割り当てられていない場合は、最初の側が頂点初期化されるときに、これらの構造では②の後、エラーが発生します、これはありますJava言語の異なる点

エラーがプログラムを発生しない場合③最初に割り当てリストの最初の頂点の第1の縁へのポインタの必要性は、NULLの割り当ては、このステップは、必須である場合

ここで記憶されているが、頂点の数を入力するようにコンソールで表示する権利があるので④、エッジ、エッジ重みの数は、新しいノードを作成ArcNode

それは頂点ノードポインタに空firstarc現在のポインタがある場合、ノードはヌルに、adjvex vを割り当てられているNULLであるが、図に開始頂点ポインタポインティングの最初のエッジかどうかの入力側に割り当てた後に決定されますノードのリストを横断し、insertNode法のリストに挿入されたコールが空でない追加は、最終的な表面のリストに挿入されます

⑤我々が横断するfirstarc頂点に対応する現在のインデックスが空であるかを決定するために、頂点の配列をマップし、ループを通過することができるので、空の現在の頂点が度ではない説明するように、隣接テーブル後に作成され、側面がありますその後、我々は全体の頂点リストを横断するwhileループを使用する必要があります

私が最も重要なことは、初期化エラー時のC言語のポインタがあるように思われるとそうでない場合と同様のデータ構造を見ることとなっている表現の各要素の意味を理解することであるNULLであると感じ

次のようにテストデータは以下のとおりです。

3.次の特定のコードです。

#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define maxSize 1000
using namespace std;
typedef struct ArcNode{
	int adjvex;
	struct ArcNode *nextarc;
	int info;
}ArcNode; 

typedef struct{
	int data;
	ArcNode *firstarc;
}Vnode; 

typedef struct{
	Vnode adjlist[maxSize];
	int n, e;
}AGraph;

AGraph *graph;
void  insertNode(ArcNode *node, ArcNode *newNode){
	ArcNode *p = node;
	while(p->nextarc != NULL){
		p = p->nextarc;
	}
	p->nextarc = newNode;	
}

void create(){
	graph = (AGraph*)malloc(sizeof(AGraph));
	cout << "输入顶点的数目: " << endl;
	cin >> graph->n;
	cout << "输入图中边的数目: " << endl;
	cin >> graph->e;
	cout << graph->n << " ";

	int u = -1, v = -1, weight = -1;
	for(int i = 0; i < graph->n; i++){
		graph->adjlist[i].firstarc = NULL;
	}
	
	ArcNode *node; 
	cout << graph->e << endl;
	for(int i = 0; i < graph->e; i++){
		cin >> u >> v >> weight;
		node = (ArcNode *)malloc(sizeof(ArcNode));
		node->adjvex = v;
		node->info = weight;
		node->nextarc = NULL;
		graph->adjlist[u].data = u;
		if(graph->adjlist[u].firstarc == NULL){
			//边 
			graph->adjlist[u].firstarc = node; 
		}else{
			//插入边
			insertNode(graph->adjlist[u].firstarc, node); 
		}	
	} 
}

void  travseTree(){
	for(int i = 0; i < graph->n; i++){
		if(graph->adjlist[i].firstarc != NULL){
			cout << i << " ";
			ArcNode *p = graph->adjlist[i].firstarc;
			while(p != NULL){
				cout << p->adjvex <<  " ";
				p = p->nextarc;
			}
			cout << endl;
		} 
	} 
}

int main(void){
    create();
	travseTree();
	return 0;
} 

 

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/92692027