用邻接表储存结构实现图的(非)递归(广)深度遍历(C++

本文介绍了使用邻接表结构来实现图的非递归深度优先遍历和广度优先遍历。作者首先定义了顶点、弧和图的结构体,并展示了图的建立和打印邻接表的过程。接着详细讲解了非递归和递归的两种深度遍历方法,以及非递归的广度优先遍历。在图的简单应用部分,讨论了如何查找v1到v2的路径及是否存在长度为k的简单路径。文章以C++代码实现,适合初学者学习和交流。
摘要由CSDN通过智能技术生成

叽里呱啦:笔者是一名程序员萌新,所写的代码可能会有很多很多方面的不足,欢迎一起交流。
此篇文章是笔者在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<<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值