数据结构作业--图遍历

数据结构老师布置一道题目,憋了一天才搞出来,还是练习地不够啊!不过班里面其他人搞出来的也不多啊!

 

 

题目

 

PS:头文件是老师给的。

一、请建立一个空项目,添加GraphTraverseTest.cpp源文件和AdjMWGraph.h、AdjLWGraph.h、CreatAdjWGraph.h、AdjWGraphApp.h、SeqList.h、SeqQueue.h等六个头文件。其中:

    AdjMWGraph.h头文件采用邻接矩阵实现带权有向图数据结构;
    AdjLWGraph.h头文件采用邻接表实现带权有向图数据结构;
    CreatAdjWGraph.h头文件实现邻接矩阵图的构造和邻接表图的构造;
    AdjWGraphApp.h头文件实现图的应用(包括最小生成树Prim算法和最短路径Dijkstra算法)
    SeqList.h头文件实现顺序表数据结构;
    SeqQueue.h头文件实现顺序循环队列数据结构。



二、你的任务:

    在图的应用头文件AdjWGraphApp.h中,完成Path(v0)函数,实现输出图中第v0顶点到其余各顶点的路径。
    提示:(1)采用遍历实现;(2)要考虑路径的表现形式和存储结构。

我是这样实现的:

vector<int>vec_path;


bool Is_In_Vector(vector<int> &vec,int m)
{
    int judge(0);


    for(size_t i(0);i<vec.size();i++)
    {
        if(m==vec[i]) judge=1;
    }


    if(judge==1) return 1;
    else return 0;
}

 

//Path函数适用于邻接矩阵带权有向图和邻接表带权有向图数据结构;

template <class GraphType>

int * Path(GraphType &G0,int v0,int vx)
{

    //GrapType类,图类;
    vec_path.push_back(v0);

    //for循环,遍历v0指向的结点;
    for(int j=0;j<G0.NumOfVertices();j++)

    {

        //NumberOfVertices(),结点数目;
        if(j==vx) continue;
        if(G0.IsEdge(v0,j)==1 && Is_In_Vector(vec_path,j)==0)
            Path(G0,j,vx);    //递归
    }

   
    if(G0.IsEdge(v0,vx)==1)    //判断v0和vx之间是否存在边,若存在边IsEdge返回1;
    {
        for(size_t i=0;i<vec_path.size();i++)
        {
            cout<<vec_path[i];
        }
        cout<<vx<<"  end"<<endl;  //输出路径
        vec_path.pop_back();
        return 0;
    }


    else vec_path.pop_back();
}

 

这是一个递归算法,做得时候很别扭,要逆着想。不过做出来之后还是很有成就感滴,嘿嘿嘿嘿嘿~

你可能感兴趣的:(数据结构作业--图遍历)