C言語の実装隣接テーブル深さ優先トラバーサル

1.グラフトラバーサルトラバーサル方法には2つのタイプがあります。私たちが訪問した場合、深さ優先探索と幅優先トラバーサルは、違いのツリーをトラバースすると訪れたノードをマークするタグの配列を増やす必要があり、もはやアクセスすることができます

2.以下は、深さ優先トラバーサルのC言語の実装です。

、マップを保存し、以下の隣接テーブルを使用するには、①最初の必要性は、私の以前のブログの書き込みでマップを保存するために、隣接テーブルを使用して(マップを保存する方法です。https://blog.csdn.net/qq_39445165/article/details / 92692027

②頂点が訪問されているかどうかをマークするために配列を宣言、深さ優先トラバーサルをマッピングします

3.以下は、特定のプログラムです。

#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define maxSize 1000
int visit[maxSize];
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;
	int u = -1, v = -1, weight = -1;
	for(int i = 0; i < graph->n; i++){
		graph->adjlist[i].firstarc = NULL;
	}
	
	ArcNode *node; 
	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 dfs(AGraph *G, int v){
	ArcNode *p;
	visit[v] = 1;
	cout << v << " ";
	p = G->adjlist[v].firstarc;
	while(p != NULL){
		if(visit[p->adjvex] == 0){
			dfs(G, p->adjvex);
		}
		p = p->nextarc;	
	}
} 

int main(void){
	create();
	dfs(graph, 0);
	return 0;
} 

 

おすすめ

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