1. 各种模板类的数据抽象:
    数据结构c++实现——图

  2. 步骤示意:
    数据结构c++实现——图

  3. 递归过程:
    数据结构c++实现——图

  4. 要创建的图以及对应的邻接表:
    数据结构c++实现——图

  5. 代码实现:
    //graph.h

#ifndef GRAPH_H
#define GRAPH_H

#include <string>

template<typename T>
class VertexNode;

template<typename T>
class Graph;

const int MAX = 10;
bool visit[MAX];


//边表
template<typename T>
class EdgeNode
{
    friend class VertexNode<T>;
    friend class Graph<T>;
public:
    EdgeNode() : adjvex(0), next(nullptr) {}

private:
    size_t adjvex;      //下标
    EdgeNode* next;     //next指针
};

template<typename T>
class Graph;

//顶点表
template<typename T>
class VertexNode
{
    friend class Graph<T>;
public:
    VertexNode() : firstedge(nullptr) {}

private:
    T data;                  //顶点包含的数据
    EdgeNode<T>* firstedge;  //指向邻接表的第一个结点
};

template<typename T>
class Graph
{
public:
    Graph() : numVex(0), numEdge(0) {}

    //图的创建
    void createGraph();

    //得到图的元素
    T getElement(size_t);

    //遍历图
    void print();

private:
    VertexNode<T> vertexList[MAX];
    size_t numVex;          //顶点数
    size_t numEdge;         //边数
    //创建顶点表
    void createVertex();
    //创建边表
    void createEdge();
    //深度优先遍历
    void DFS(size_t);
};

#endif // GRAPH_H



template<typename T>
void Graph<T>::createGraph()
{
    createVertex(); //1.创建点集
    createEdge();//2.创建边集
}

template<typename T>
T Graph<T>::getElement(size_t sz)
{
    return vertexList[sz].data;
}

template<typename T>
void Graph<T>::print()
{
    size_t i;
    for(i = 0; i < numVex; ++i)
        visit[i] = false;       //false标记此顶点未被访问过

    std::cout<<"the DFS's result is: "<<std::endl;
    for(i = 0; i < numVex; ++i)
    {
        if(visit[i] == false)
            DFS(i);
    }
}

template<typename T>
void Graph<T>::createVertex()
{
    std::cout<<"please enter the Vertex's numbers and the Edge's numbers : "<<std::endl;
    size_t v, e;
    std::cin>>v>>e;
    numVex = v;
    numEdge = e;
    T v_data;
    for(size_t i = 0; i < numVex; ++i)
    {
        std::cout<<"please enter the Vertex's data: "<<std::endl;

        std::cin>>v_data;
        vertexList[i].data = v_data;
        vertexList[i].firstedge = nullptr;
    }

}

template<typename T>
void Graph<T>::createEdge()
{
    size_t i, j;

    EdgeNode<T>* e;
    for(size_t k = 0; k < numEdge; ++k)
    {
        std::cout<<"please enter the Edge(vi, vj)'s 'i' and 'j' : "<<std::endl;

        std::cin>>i>>j;

        e = (EdgeNode<T>*)malloc(sizeof(EdgeNode<T>));
        e->adjvex = j;
        e->next = vertexList[i].firstedge;
        vertexList[i].firstedge = e;

        e = (EdgeNode<T>*)malloc(sizeof(EdgeNode<T>));

        e->adjvex = i;
        e->next = vertexList[j].firstedge;
        vertexList[j].firstedge = e;
    }

}

template<typename T>
void Graph<T>::DFS(size_t i)
{
    visit[i] = true;
    std::cout<<vertexList[i].data<<' ';

    EdgeNode<T>* p;
    p = vertexList[i].firstedge;

    while(p)
    {
        if(!visit[p->adjvex])
            DFS(p->adjvex);
        p = p->next;
    }
}

//main.cpp

#include <iostream>
#include "graph.h"

using namespace std;

int main(int argc, char *argv[])
{
    Graph<char> g;
    g.createGraph();

    g.print();

    cout<<endl<<g.getElement(2)<<endl;

    return 0;
}

  1. 输入及实现结果:
    数据结构c++实现——图

相关文章:

  • 2021-10-28
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-24
  • 2021-07-20
  • 2021-11-16
猜你喜欢
  • 2020-07-28
  • 2022-01-12
  • 2021-08-29
  • 2022-12-23
  • 2021-12-18
  • 2019-03-06
相关资源
相似解决方案