数据结构之图的邻接矩阵

刚才,没事就随便写了一个图的邻接矩阵的部分功能,主要是邻接矩阵的定义,定义邻接矩阵,我用了先前写的三元组的代码.另外就是试着实现邻接矩阵的图的遍历.

下面,我们就来看看如何实现的吧.代码是临时写的,也许有些错误. 不过,我测试还好.没发现错误.

好了,我们来看代码吧:

头文件:

#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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值