#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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/shen_ming/article/details/45887661
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。