//環境:vs2010
//ALGraph.cpp
#include <iostream>
using namespace std;
const int MaxSize=10; //圖的最大頂點數
struct ArcNode //定義邊表結點
{
int adjvex; //鄰接點域
ArcNode *next;
};
template <class DataType>
struct VertexNode //定義頂點表結點
{
DataType vertex;
ArcNode *firstedge;
};
template <class DataType>
class ALGraph
{
public:
ALGraph(DataType a[ ], int n, int e); //構造函數,建立一個有n個頂點e條邊的圖
~ALGraph( ); //析構函數,釋放鄰接表中各邊表結點的存儲空間
void DFSTraverse(int v); //深度優先遍歷圖
void BFSTraverse(int v); //廣度優先遍歷圖
private:
VertexNode<DataType> adjlist[MaxSize]; //存放頂點表的數組
int vertexNum, arcNum; //圖的頂點數和邊數
};
template <class DataType>
ALGraph<DataType>::ALGraph(DataType a[ ], int n, int e)
{
ArcNode *s;
int i, j, k;
vertexNum = n; arcNum = e;
for (i = 0; i < vertexNum; i++) //輸入頂點信息,初始化頂點表
{
adjlist[i].vertex = a[i];
adjlist[i].firstedge = NULL;
}
for (k = 0; k < arcNum; k++) //依次輸入每一條邊
{
cout<<"請輸入邊的兩個頂點的序號:";
cin >> i >> j; //輸入邊所依附的兩個頂點的編號
s = new ArcNode; s->adjvex = j; //生成一個邊表結點s
s->next = adjlist[i].firstedge; //將結點s插入到第i個邊表的表頭
adjlist[i].firstedge = s;
}
}
template <class DataType>
ALGraph<DataType>::~ALGraph( )
{
ArcNode *p;
for(int i=0; i<vertexNum; i++)
{
p=adjlist[i].firstedge;
while(p!=NULL) //循環刪除
{
adjlist[i].firstedge=p->next;
delete p; //釋放結點空間
p=adjlist[i].firstedge;
}
}
}
template <class DataType>
void ALGraph<DataType>::DFSTraverse(int v)
{
ArcNode *p; int j;
cout<<adjlist[v].vertex; visited[v] = 1;
p = adjlist[v].firstedge; //工作指針p指向頂點v的邊表
while (p != NULL) //依次搜索頂點v的鄰接點j
{
j = p->adjvex;
if (visited[j] == 0) DFSTraverse(j);
p = p->next;
}
}
template <class DataType>
void ALGraph<DataType>::BFSTraverse(int v)
{
int front =-1, rear = -1;int k; //初始化隊列, 假設隊列採用順序存儲且不會發生溢出
int Q[MaxSize];
ArcNode *p;
cout<<adjlist[v].vertex; visited[v] = 1; Q[++rear] = v; //被訪問頂點入隊
while (front != rear) //當隊列非空時
{
k = Q[++front];
p = adjlist[k].firstedge; //工作指針p指向頂點v的邊表
while (p != NULL)
{
int j = p->adjvex;
if (visited[j] == 0) {
cout<<adjlist[j].vertex; visited[j]=1;Q[++rear]=j;
}
p=p->next;
}
}
}
int visited[MaxSize] = {0};
int main()
{
char ch[ ]={'A','B','C','D','E'};
int i;
ALGraph<char> ALG(ch, 5, 6);
for (i = 0; i < MaxSize; i++)
visited[i] = 0;
cout<<"深度優先遍歷序列是:";
ALG.DFSTraverse(0);
cout<<endl;
for (i = 0; i < MaxSize; i++)
visited[i] = 0;
cout<<"廣度優先遍歷序列是:";
ALG.BFSTraverse(0);
cout<<endl;
return 0;
}