图的深度优先遍历递归算法主针对邻接表有向图

以下是源代码:

#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
typedef int EdgeData;  
typedef char VertexData; //顶点数据域 

typedef struct node {  //  边表节点 
     EdgeData cost; //边上d权值
     int adjvex;   //邻接点域 
     struct node *next; //下一边链接指针 
}EdgeNode;  

typedef struct {  //  顶点表 
     VertexData vertex; //顶点数据域 
     EdgeNode *firstEdge; // 边链表头指针
}VertexNode;  

typedef struct {  //  图的邻接表 
     VertexNode verlist[MAX_VERTEX_NUM] ; 
     int vexnum,edgenum; //顶点数和边数
}AdjGraph;   

void printAdjGraph(AdjGraph G){
	cout<<"得到的有向图如下:"<<endl;
	int i ;
	for(i = 0;i<G.vexnum;i++){
		cout<<G.verlist[i].vertex<<"-->";
		EdgeNode *e = G.verlist[i].firstEdge;
		while(e!=NULL){
		cout<<e->adjvex<<"-->";
			e = e->next; 
		}
		cout<<endl;
	} 
}

//建立图的邻接表 
AdjGraph createAdjGraph(AdjGraph G){ 
	int i,j,k,w;
	cout<<"输入顶点数和边数"<<endl;
	cin>>G.vexnum>>G.edgenum;
	cout<<"输入顶点信息"<<endl;
	for(i = 0 ; i<G.vexnum;i++){
		cin>>G.verlist[i].vertex;
		G.verlist[i].firstEdge = NULL; //将边表置为空表 
	}
	EdgeData weight;
	int head;
	int tail;
	cout<<"输入第tail号边表的前端索引head,和权值weight,如(tail head weight)"<<endl;
	 for(k=0;k<G.edgenum;k++){
	 	cin>>tail>>head>>weight;
	 	EdgeNode *p = new EdgeNode;
	 	p->adjvex = head;
		p->cost = weight;
		p->next = G.verlist[tail].firstEdge;
		G.verlist[tail].firstEdge = p;    // 一条边是 tail---->head 
		
		//创建无向图的话就再加上下面的代码 
//		p = new EdgeNode;
//	 	p->adjvex = tail;
//		p->cost = weight;
//		p->next = G.verlist[head].firstEdge;
//		G.verlist[head].firstEdge = p;
		if(k==G.edgenum-1)
			printAdjGraph(G);
	 }
	 return G;
	 
}

bool visited[MAX_VERTEX_NUM] ;  
int dfn[MAX_VERTEX_NUM]; //顶点的先深编号 
int count = 1;
void DFS1(AdjGraph G,int i){
	EdgeNode *p;
	cout<<G.verlist[i].vertex<<endl;
	visited[i] = true;
	dfn[i] = count++;
	p = G.verlist[i].firstEdge;
	while(p){
		if(!visited[p->adjvex])
			DFS1(G,p->adjvex);
		p = p->next;
	} 
	
	//若是邻接矩阵则用下面的程序替代while(p)程序段 
//	for(j=0;j<G.vexnum;j++)
//		if(G.egde[i][j]==1 && !visited[i])
//			DFS2(G,j);
//	
	
} 

//深度优先遍历主程序 
void DFSTraverse(AdjGraph G){
	int i ; 
	for(i=0;i<G.vexnum;i++)
		 visited[i]=false;
	for(i=0;i<G.vexnum;i++)
		if(!visited[i])
			DFS1(G,i);
} 


main(){
	AdjGraph G ;
	G = createAdjGraph(G);
	cout<<"深度优先遍历的结果:"<<endl;
	DFSTraverse(G);
	system("pause");
}

程序运行结果截图

《图的深度优先遍历递归算法主针对邻接表有向图》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/wen942467928/article/details/47678961
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞