刚才,没事就随便写了一个图的邻接矩阵的部分功能,主要是邻接矩阵的定义,定义邻接矩阵,我用了先前写的三元组的代码.另外就是试着实现邻接矩阵的图的遍历.
下面,我们就来看看如何实现的吧.代码是临时写的,也许有些错误. 不过,我测试还好.没发现错误.
好了,我们来看代码吧:
头文件:
#ifndef _GRAPHIC_H_H_
#define _GRAPHIC_H_H_
//包含三元组头文件
#include "..//SArray//SArray.h"
typedef struct _GNode
{
int num; //图的节点的编号
void * pInfo; //图的节点的信息
}GNode,*PGNode;
typedef GNode GNodeList[MAX_SIZE];
/*------------------------------------------------------*/
用邻接矩阵实现图(有向图)的各种算法(这里不考虑带权图)
我们这里假定图中的节点最大不超过MAX_SIZE
有效边的数目不超过MAX_SIZE
我这里只是实现功能的例子,在实际应用中只可以作为借鉴,不可
以直接用的
/*------------------------------------------------------*/
class CGraphic
{
private:
CSArray<int> m_Edges; //保存边的信息(三元组实现)
int m_nEdge; //有效边的数目
GNodeList m_Nodes; //保存节点的信息(数组)
int m_nNode; //节点数目
bool m_bVisited[MAX_SIZE]; //用于遍历图时判断途中的某个编号的节点是否遍历过
private:
public:
CGraphic();
void SetNodes( PGNode pNode, int nNode ); //设置图中节点数目
void SetEdge ( int i, int j, int value ); //设置途中两个节点是否连接
/*-----------------------------------*/
图的遍历算法
/*-----------------------------------*/
void ResetVisited();
//深度优先遍历算法
void DFS( int nStart ); //从那个编号节点开始遍历
//广度优先遍历算法
void BFS( int nStart ); //从那个编号节点开始遍历
public:
};
#endif//_GRAPHIC_H_H_
实现文件以及测试代码:
#include "iostream"
using namespace std;
#include "Graphic.h"
CGraphic::CGraphic()
{
m_nEdge = 0;
m_nNode = 0;
memset( m_bVisited, 0, sizeof(m_bVisited) );
}
void CGraphic::SetNodes( PGNode pNode, int nNode )
{
int i = 0;
for ( i = 0; i < nNode; i++ )
{
m_Nodes[i].num = pNode[i].num;
m_Nodes[i].pInfo = pNode[i].pInfo;
}
m_nNode = nNode;
m_Edges.SetSArraySize( 0, nNode, nNode );
}
void CGraphic::SetEdge( int i, int j, int value )
{
m_Edges.SetAt( i, j, value );
m_nEdge++;
}
void CGraphic::ResetVisited()
{
memset( m_bVisited, 0, sizeof(m_bVisited) );
}
void CGraphic::DFS( int nStart )
{
int i = 0;
m_bVisited[nStart] = 1;
cout << m_Nodes[nStart].num ;
for ( i = 0; i < m_nNode; i++ )
{
if ( m_Edges(nStart, i) != 0 && m_bVisited[i] == false )
{
DFS( i );
}
}
}
void CGraphic::BFS( int nStart )
{
int i = 0,j = 0;
int queue[MAX_SIZE];
int front = 0,rear = 0;
m_bVisited[nStart] = 1;
cout << m_Nodes[nStart].num ;
rear = (rear + 1)%MAX_SIZE;
queue[rear] = nStart;
while ( front != rear )
{
front = (front + 1)%MAX_SIZE;
i = queue[front];
for ( j = 0; j < m_nNode; j++ )
{
if ( m_Edges( i, j ) != 0 && m_bVisited[j] == false )
{
m_bVisited[j] = 1;
cout << m_Nodes[j].num ;
rear = (rear + 1)%MAX_SIZE;
queue[rear] = j;
}
}
}
cout << endl;
}
void main()
{
CGraphic graphic;
GNode node[5];
int i = 0,j = 0;
for( i = 0; i < 5; i++ )
{
node[i].num = i;
node[i].pInfo = NULL;
}
graphic.SetNodes( node, 5 );
graphic.SetEdge( 0, 3, 1 );
graphic.SetEdge( 0, 2, 1 );
graphic.SetEdge( 3, 1, 1 );
graphic.SetEdge( 1, 2, 1 );
graphic.SetEdge( 2, 4, 1 );
graphic.DFS(0);
cout << endl;
graphic.ResetVisited();
graphic.BFS(0);
}
呵呵,这样就搞定了,
下回,我就来用邻接表来实现一个完整的图的实现代码.注意看啊.
BYE