//DFS遍历有向图
//采用十字链表存储结构
//2017.3.30
//lovesunmoonlight
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define MAX_VERTEX_NUM 20
struct ArcBox;
queue<int> order;
//表头结点
typedef struct VexNode
{
ArcBox *firstin,*firstout;
double data;
}VexNode;
//边结点
typedef struct ArcBox
{
int tailvex,headvex;
ArcBox *hlink,*tlink; //hlink指向head相同的下一条边,tlink指向tail相同的下一条边
double data;
}ArcBox;
//图定义
typedef struct
{
VexNode xlist[MAX_VERTEX_NUM]; //表头数组
int vexnum,arcnum; //顶点数和边数
}OLGraphy;
//初始化图
void initialGraphy(OLGraphy& g,int vexnum,int arcnum)
{
g.vexnum=vexnum;
g.arcnum=arcnum;
for(int i=0;i<g.vexnum;i++)
{
g.xlist[i].data=rand()%50;
g.xlist[i].firstin=NULL;
g.xlist[i].firstout=NULL;
cout<<"结点编号:"<<i+1<<" 结点数据:"<<g.xlist[i].data<<endl;
}
cout<<endl;
int etail,ehead;
cout<<"请输入边的信息,包括起点,终点: \n";
for(int i=0;i<g.arcnum;i++)
{
cout<<"第"<<i+1<<"条边:\n";
cout<<"起点:";
cin>>etail;
cout<<"终点:";
cin>>ehead;
--etail;
--ehead;
ArcBox* p=(ArcBox*)malloc(sizeof(ArcBox));
p->tailvex=etail;
p->headvex=ehead;
//指向当前顶点的第一条出边和入边
p->hlink=g.xlist[ehead].firstin;
p->tlink=g.xlist[etail].firstout;
p->data=rand()%100;
//更新顶点的第一条出边和入边
g.xlist[ehead].firstin=p;
g.xlist[etail].firstout=p;
}
}
void DFS(const OLGraphy& g,int v,bool visited[])
{
//完成当前节点的访问
visited[v]=true;
order.push(v+1);
cout<<"结点编号:"<<v+1<<" 结点数据:"<<g.xlist[v].data<<endl;
ArcBox* temp1=g.xlist[v].firstin;
ArcBox* temp2=g.xlist[v].firstout;
while(temp1)
{
int next=temp1->tailvex; //以v为头的边,遍历与之相连的结点
if(!visited[next])
DFS(g,next,visited);
temp1=temp1->hlink;
}
while(temp2)
{
int next=temp2->headvex; //以v为尾的边,遍历与之相连的结点
if(!visited[next])
DFS(g,next,visited);
temp2=temp2->tlink;
}
}
int main()
{
OLGraphy g;
int vexnum,arcnum;
cout<<"输入顶点数和边数:\n";
cout<<"顶点数:";
cin>>vexnum;
cout<<"边数:";
cin>>arcnum;
cout<<endl;
bool visited[MAX_VERTEX_NUM]={false};
initialGraphy(g,vexnum,arcnum);
cout<<"遍历结果:\n";
DFS(g,0,visited);
cout<<"最终的遍历顺序为:\n";
int ans=order.front();
order.pop();
cout<<ans;
while(!order.empty())
{
int ans=order.front();
order.pop();
cout<<"->"<<ans;
}
cout<<endl;
return 0;
}