图的深度遍历-邻接表

#include<iostream>
using namespace std;

#define MAX_VERTEX_NUM 20 //顶点个数的最大值

typedef struct ArcNode
{
	int adjvex;
	struct ArcNode *next;
	int weight;//表示头结点到该节点的权值
}ArcNode;//表结点

typedef struct VNode{
	int data;
	ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];//头结点

typedef struct{
	int vernum,arcnum;//顶点个数,弧个数
	AdjList vertices;
}ALGraph;

int InsertG(int v1, int v2, int w ,ALGraph &G)
{//在v1顶点的链表的末尾插入v2结点
	ArcNode *p,*q;
	p = new ArcNode;
	p->next = NULL;
	p->weight = w;
	p->adjvex = v2;//构造结点

	if(G.vertices[v1].firstarc==NULL)
	{
		G.vertices[v1].firstarc = p;
	}
	else
	{
		q = G.vertices[v1].firstarc;
		while(q->next)
		{
			q = q->next;
		}
		q->next = p;
	}
	return 1;
}
int CreateALGraph(ALGraph &G)
{//构造图的邻接表
	int v1,v2,w;
	cout<<"输入顶点个数和弧个数:";
	cin>>G.vernum>>G.arcnum;

	for(int i=1;i<=G.vernum;i++)
	{//初始化头结点
		G.vertices[i].data = i;
		G.vertices[i].firstarc = NULL;
	}
	for(int i=1;i<=G.arcnum;i++)
	{
		cout<<i<<":输入弧的信息(点,点,权值):";
		cin>>v1>>v2>>w;
		InsertG(v1,  v2,  w ,G);
		InsertG(v2,  v1,  w ,G);//构成无向图,若想构成有向图则,此语句不要
	}

	cout<<"输入的图的信息为:"<<endl;
	cout<<"顶点个数为:"<<G.vernum<<endl;
	cout<<"弧个数为:"<<G.arcnum<<endl;
	cout<<"邻接表为:"<<endl;
	for(int i=1;i<=G.vernum;i++)
	{
		cout<<G.vertices[i].data<<"--";
		ArcNode *p = G.vertices[i].firstarc;
		while(p)
		{
			cout<<p->weight<<"-->"<<p->adjvex<<"--";
			p=p->next;
		}
		cout<<endl;
	}
	return 0;
}
//头结点的data值=头结点数组的下标=visited数组的下标,都是从1开始
int visited[MAX_VERTEX_NUM];//声明成全局变量,因为DFS函数中也要用

void DFS(ALGraph G,VNode v)
{
	visited[v.data]=1;//将访问数组设成1,表示访问过
	cout<<v.data<<" ";
	for(ArcNode* w= v.firstarc;w!=NULL;w=w->next)//遍历v的表结点,找到第一个没访问过的结点,进行深度遍历
		if(!visited[w->adjvex])
		{
			VNode v1=G.vertices[w->adjvex];
			DFS(G,v1);
		}
}
void DFSTraverse(ALGraph G)
{
//访问标志数组
	for(int i=1;i<=G.vernum;i++)
		visited[i]=0;//初始化
	for(int i=1;i<=G.vernum;i++)
		if(!visited[i])DFS(G,G.vertices[i]);//对每个头结点进行深度遍历
}

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