1. La estructura del gráfico realizada por la lista de adyacencia es la siguiente:
Todos los vértices conectados a cada vértice están conectados por una lista enlazada, y la secuencia de la conexión no está en ningún orden en particular.
En segundo lugar, la implementación del código
#include <iostream>
#include <list>
using namespace std;
class Vertex
{
public:
Vertex(char lab) :label(lab) {}
private:
char label;
};
template <class T>
class Graph
{
public :
Graph(int maxVertex) :VertexMax(maxVertex)
{
nVertex = 0;
VertexList = new T*[maxVertex];
HeadNodes = new list<int>[maxVertex];
}
~Graph()
{
delete[] VertexList;
delete[] HeadNodes;
}
void addVertex(T* v); //添加顶点
void addEdage(int start,int end); //添加边
void printVertex(void); //打印顶点
void printAdjList(void); //打印顶点的连接关系
private:
T** VertexList; //用来存放顶点
list<int>* HeadNodes; //顶点的连接关系数组
int VertexMax; //最大顶点个数
int nVertex; //当前顶点个数
};
template<class T>
void Graph<T>::addVertex(T *v)
{
VertexList[nVertex++] = v;
}
template<class T>
void Graph<T>::addEdage(int start, int end)
{
HeadNodes[start].push_back(end); //将end添加到start的末尾
}
template<class T>
void Graph<T>::printVertex(void)
{
for (int lop = 0; lop < nVertex; lop++)
cout << *VertexList[lop] << " ";
cout << endl;
}
template<class T>
void Graph<T>::printAdjList(void)
{
for (int lop = 0; lop < nVertex; lop++)
{
cout << lop << "->";
for (list<int>::iterator iter = HeadNodes[lop].begin(); iter != HeadNodes[lop].end(); iter++) //用迭代器来遍历
cout << *iter << " -> ";
cout << endl;
}
}
int main()
{
Graph<char> gp(5);
char a('a');
char b('b');
char c('c');
char d('d');
char e('e');
gp.addVertex(&a); //0
gp.addVertex(&b); //1
gp.addVertex(&c); //2
gp.addVertex(&d); //3
gp.addVertex(&e); //4
gp.addEdage(0,1); //A-B
gp.addEdage(0,3); //A-D
gp.addEdage(1,0); //B-A
gp.addEdage(1,4); //B-E
gp.addEdage(2,4); //C-E
gp.addEdage(3,0); //D-A
gp.addEdage(3,4); //D-E
gp.addEdage(4,3); //E-D
gp.addEdage(4,1); //E-B
gp.addEdage(4,2); //E-C
gp.printVertex();
gp.printAdjList();
return 0;
}
resultado de la operación: