C++实现图的深度遍历
以下是深度遍历的主要工作(具体作用也已标明),具体数据没有实践完成(后续将会继续完善);如有需要,可自行代入实际数据进行完善,代码中若存在问题,也欢迎各位批评指正。
```cpp
#include<iostream>
using namespace std;
#define MAXSIZE 100
//定义边节点
typedef struct EdgeNode{
int weight;
int y;
struct EdgeNode *next;
}EdgeNode;
typedef struct VectexNode{
char data;
EdgeNode *firstNode;
}VectexNode,VectexList[MAXSIZE];
typedef struct Graph{
int numEdge;
int numVectex;
VectexList veclist;
}Graph;
void initialGraph(Graph *g) //该图的创建是以无向图为研究点
{
int i,j,k;
cout<<"请输入所需的顶点数与边数"<<endl;
cin>>g->numVectex>>g->numEdge;
for(i = 0;i<g->numVectex;++i)
{
cin>>g->veclist[i].data;
g->veclist[i].firstNode = nullptr;
}
for(k = 0;k<g->numVectex;k++)
{
cout<<"请输入(Vi,Vj)的顶点数"<<endl;
cin>>i>>j;
EdgeNode *e = new EdgeNode;
e->y = j;
e->next = g->veclist[i].firstNode;
g->veclist[i].firstNode = e;
EdgeNode *e = new EdgeNode;
e->y = i;
e->next = g->veclist[j].firstNode;
g->veclist[j].firstNode = e;
}
}
//深度优先遍历算法
void DFS(Graph *g,int i,bool visited[MAXSIZE])
{
cout<<g->veclist[i].data<<endl;//访问第i个顶点的数据
visited[i] = true; //判断是否已经被访问;如果已经访问,返回true,反之亦然
EdgeNode *e = g->veclist[i].firstNode; //把图中第i个顶点的指向地址赋值给e
while(e) //指向不为空
{
if(!visited[e->y]) //如果第(e->y)个节点未被访问
{
DFS(g,e->y,visited);
}
e = e->next;
}
}
//深度遍历实现
void DFSReverse(Graph *g)
{
bool visited[MAXSIZE];
for(int i = 0;i<g->numVectex;i++)
{
visited[i] = false; //初始化节点,并设为未被访问
}
for(int j = 0;j<g->numVectex;j++)
{
DFS(g,j,visited);
}
}
int main()
{
/*
代入数据,请大家自行完善
*/
system("pause");
return 0;
}