用邻接表储存结构实现图的(非)递归(广)深度遍历(C++)
叽里呱啦:笔者是一名程序员萌新,所写的代码可能会有很多很多方面的不足,欢迎一起交流。
此篇文章是笔者在CSDN上的第一篇,对排版方面没有什么经验,内容有不足的地方欢迎指正
本实验效果以下图为例:
测试输入:
图的定义,建立与打印
顶点、弧、图的结构体
弧结点
//弧结点 arcNode
struct ArcNode{
int adjvex; //顶点位置
int weight; //权重
ArcNode* next; //下一个弧结点
};
顶点结点
//顶点结点 vertexNode
struct VNode{
bool visited;
int index; //下标
string data; //顶点信息
ArcNode* firstArc; //指向第一条依附该顶点的指针
};
图结构体
//图
struct Graph{
int gvn;//GraphVertexNumber 顶点数
int gan;//GraphArcNumber 弧数
//构造函数
Graph(int gvn,int gan){
this->gvn = gvn;
this->gan = gan;
}
//创建顶点数组
VNode vNode[100];
};
图的建立
//建立图的邻接表
void CreateAdjGraph(Graph &g){
ArcNode *a;
cout<<"请依次输入顶点的信息:"<<endl;
for(int i = 0; i < g.gvn; i++) //建立顶点表
{
cin >> g.vNode[i].data;
g.vNode[i].index = i;
g.vNode[i].visited = false;
g.vNode[i].firstArc = NULL; //置空指向第一条依附该顶点的指针
}
cout<<"请依次输入每条弧连接的两个顶点的下标(v1顶点指向v2)和权重:"<<endl;
for(int i = 0; i < g.gan; i++)
{
int v1,v2,weight;
// cin>>v1>>v2;//根据需要确定是否要输入权重
cin>>v1>>v2>>weight;
a = new ArcNode;
a->adjvex = v2;
a->weight = weight;
a->next = g.vNode[v1].firstArc;
g.vNode[v1].firstArc = a;
}
}
打印邻接表
以下仅作为邻接表的测试
//打印邻接表
void PrintfGraphAdjList(Graph g){
for(int i = 0; i < g.gvn; i++)
{
cout<<g.vNode[i].data<<"指向的顶点有:";
ArcNode *p = g.vNode[i].firstArc;
while(p!=NULL)
{
cout << g.vNode[p->adjvex].data<<" ";
p = p->next;
}
cout << endl;
}
for(int i = 0;i < g.gvn;i++){
cout<<g.vNode[i].data<<