-
各种模板类的数据抽象:
-
步骤示意:
-
递归过程:
-
要创建的图以及对应的邻接表:
-
代码实现:
//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;
}
}
#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;
}
- 输入及实现结果: