#pragma once#include<iostream>#include<list>#include<stack>#include<queue>usingnamespace std;template<classT>classAdjacencyGraph{public:AdjacencyGraph(size_t capacity =20);~AdjacencyGraph();classVertex//顶点{public:Vertex(T v):bVisited(0){ val = v;}friendclassAdjacencyGraph<T>;private:
T val;bool bVisited;};public:voidaddVertex(const T&);//增加顶点voidaddEdge(int start,int end);//增加边voidprintVertice()const;//打印所有顶点voidprintAdjacencyTable()const;//打印邻接表voidBFS();voidDFS();private:
size_t m_size;//顶点个数
size_t m_capacity;//最多可容纳顶点数
Vertex** m_vArray;//顶点列表
list<int>* m_pList;//邻接表};template<classT>inline AdjacencyGraph<T>::AdjacencyGraph(size_t c):m_size(0),m_capacity(c){
m_vArray =new Vertex *[c];
m_pList =new list<int>[c];}template<classT>inline AdjacencyGraph<T>::~AdjacencyGraph(){delete[] m_vArray;delete[] m_pList;}template<classT>inlinevoid AdjacencyGraph<T>::addVertex(const T& item){if(m_size == m_capacity)throw"超出容量";
m_vArray[m_size++]=newVertex(item);}template<classT>inlinevoid AdjacencyGraph<T>::addEdge(int start,int end){
m_pList[start].push_back(end);}template<classT>inlinevoid AdjacencyGraph<T>::printVertice()const{
std::cout <<"顶点个数为 "<< m_size <<" 个:"<< std::endl;for(size_t i =0; i < m_size; i++){
cout << m_vArray[i]->val <<" ";}
cout << endl;}template<classT>inlinevoid AdjacencyGraph<T>::printAdjacencyTable()const{for(size_t i =0; i < m_size; i++){
cout << m_vArray[i]->val;for(auto iter = m_pList[i].begin(); iter != m_pList[i].end();++iter)
cout <<" -> "<<*iter;
cout << endl;}}template<classT>inlinevoid AdjacencyGraph<T>::BFS(){if(m_size ==0)return;
queue<int> q;
q.push(0);
m_vArray[0]->bVisited =true;//标记已访问
cout <<"BFS: ";while(!q.empty()){int cur = q.front();
q.pop();
cout <<" -> "<< m_vArray[cur]->val;//访问结点//遍历该节点的邻接表,把未访问的连接结点加入队列for(auto it = m_pList[cur].begin(); it != m_pList[cur].end(); it++){if(!m_vArray[*it]->bVisited){
q.push(*it);
m_vArray[*it]->bVisited =true;//标记已访问}}}
cout << endl;//恢复未访问状态for(size_t i =0; i < m_size; i++){
m_vArray[i]->bVisited =false;}}template<classT>inlinevoid AdjacencyGraph<T>::DFS(){if(m_size ==0)return;
stack<int> st;
st.push(0);
m_vArray[0]->bVisited =true;//标记已访问
cout <<"DFS";while(!st.empty()){int cur = st.top();
st.pop();
cout <<" -> "<< m_vArray[cur]->val;//访问结点for(auto it = m_pList[cur].begin(); it != m_pList[cur].end(); it++){if(!m_vArray[*it]->bVisited){
st.push(*it);
m_vArray[*it]->bVisited =true;//标记已访问}}}
cout << endl;//恢复未访问状态for(size_t i =0; i < m_size; i++){
m_vArray[i]->bVisited =false;}}
测试用例
#include"AdjacencyGraph.h"voidmain(){
AdjacencyGraph<char> g;
g.addVertex('A');//0
g.addVertex('B');//1
g.addVertex('C');//2
g.addVertex('D');//3
g.addVertex('E');//4
g.addEdge(0,1);
g.addEdge(0,3);
g.addEdge(1,0);
g.addEdge(1,4);
g.addEdge(2,4);
g.addEdge(3,0);
g.addEdge(3,4);
g.addEdge(4,1);
g.addEdge(4,2);
g.addEdge(4,3);
g.printVertice();
g.printAdjacencyTable();
g.BFS();
g.DFS();
std::cout <<" "<< std::endl;}/*
顶点个数为 5 个:
A B C D E
A -> 1 -> 3
B -> 0 -> 4
C -> 4
D -> 0 -> 4
E -> 1 -> 2 -> 3
BFS: -> A -> B -> D -> E -> C
DFS -> A -> D -> E -> C -> B
*/