圖的構造和實現——鄰接表[有向圖](c++)

//環境: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;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章