@这篇文档是由C++代码实现的图
图分为有向图和无向图。我们暂且将结点与结点之间的弧的权值不赋其他值,只是分为0和1,两个结点之间有链接就赋值为1,没有连接就赋值为0.这样就会形成一个邻接矩阵,这个矩阵中行和列的交叉处的值,代表行和列所代表的结点之间是否有连接。
本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是Tree.h和Tree.cpp和Node.h和Node.cpp和demo.cpp文件
其中Node.h定义了结点的数据成员,包括储存数据的m_cData和该结点是否被访问过的布尔值,还有结点的构造函数。Cmap.h中定义了图元素所拥有的数据成员和成员函数。demo.h中以下图中的无向图为例,将图元素存入图中,并将图中的弧也存入一个数组中,相当于一个矩阵。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019053016162017.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQxMTQ3NjM=,size_16,color_FFFFFF,t_70)
Node.h文件
#ifndef NODE_H
#define NODE_H
class Node
{
public:
Node(char data=0);
char m_cData;
bool m_bIsVisited;
};
#endif
Node.cpp文件
#include "Node.h"
Node::Node(char data)
{
m_cData = data;
m_bIsVisited = false;
}
Cmap.h文件
#ifndef CMAP_H
#define CMAP_H
#include "Node.h"
#include <iostream>
#include <vector>
using namespace std;
class Cmap
{
public:
Cmap(int capacity);
~Cmap();
bool addNode(Node *pNode);
void resetNode();
bool setValueToMatrixForDirectedGraph(int row, int col, int val=1);
bool setValueToMatrixForUndirectedGraph(int row, int col, int val=1);
void printMatrix();
void depthFirstTraverse(int nodeIndex);
void breadthFirstTraverse(int nodeIndex);
private:
bool getValueFromMatrix(int row,int col, int &val);
void breadthFirstTraverseImpl(vector<int> preVec);
int m_iCapacity;
int m_iNodeCount;
Node *m_pNodeArray;
int *m_pmatrix;
};
#endif
Camp.cpp文件
#include "Cmap.h"
#include <iostream>
#include <vector>
using namespace std;
Cmap::Cmap(int capacity)
{
m_iCapacity = capacity;
m_iNodeCount = 0;
m_pNodeArray = new Node[m_iCapacity];
m_pmatrix = new int[m_iCapacity*m_iCapacity];
for (int i=0;i<m_iCapacity*m_iCapacity;i++)
{
m_pmatrix[i] = 0;
}
}
Cmap::~Cmap()
{
delete []m_pNodeArray;
delete []m_pmatrix;
}
bool Cmap::addNode(Node *pNode)
{
if (pNode == NULL)
{
return false;
}
m_pNodeArray[m_iNodeCount].m_cData = pNode->m_cData;
m_iNodeCount++;
return true;
}
void Cmap::resetNode()
{
for (int i=0;i<m_iNodeCount;i++)
{
m_pNodeArray[i].m_bIsVisited = false;
}
}
bool Cmap::setValueToMatrixForDirectedGraph(int row, int col, int val)
{
if (row <0 || row >= m_iCapacity)
{
return false;
}
if (col <0 || col >= m_iCapacity)
{
return false;
}
m_pmatrix[row*m_iCapacity +col] = val;
return true;
}
bool Cmap::setValueToMatrixForUndirectedGraph(int row, int col, int val)
{
if (row <0 || row >= m_iCapacity)
{
return false;
}
if (col <0 || col >= m_iCapacity)
{
return false;
}
m_pmatrix[row*m_iCapacity +col] = val;
m_pmatrix[col *m_iCapacity + row] = val;
return true;
}
void Cmap::printMatrix()
{
for (int i=0;i<m_iCapacity;i++)
{
for (int j=0;j<m_iCapacity;j++)
{
cout << m_pmatrix[i*m_iCapacity+j] << " ";
}
cout << endl;
}
}
bool Cmap::getValueFromMatrix(int row,int col, int &val)
{
if (row <0 || row >= m_iCapacity)
{
return false;
}
if (col <0 || col >= m_iCapacity)
{
return false;
}
val = m_pmatrix[row*m_iCapacity + col];
return true;
}
void Cmap::depthFirstTraverse(int nodeIndex)
{
int value = 0;
cout << nodeIndex << ":" <<m_pNodeArray[nodeIndex].m_cData << " ";
m_pNodeArray[nodeIndex].m_bIsVisited = true;
for (int i=0;i<m_iCapacity;i++)
{
getValueFromMatrix(nodeIndex,i,value);
if (value == 1)
{
if (m_pNodeArray[i].m_bIsVisited)
{
continue;
}
else
{
depthFirstTraverse(i);
}
}
else
{
continue;
}
}
}
void Cmap::breadthFirstTraverse(int nodeIndex)
{
cout << nodeIndex << ":" << m_pNodeArray[nodeIndex].m_cData << " ";
m_pNodeArray[nodeIndex].m_bIsVisited = true;
vector<int> curVec;
curVec.push_back(nodeIndex);
breadthFirstTraverseImpl(curVec);
}
void Cmap::breadthFirstTraverseImpl(vector<int> preVec)
{
int value = 0;
vector<int> curVec;
for (int j =0; j<(int)preVec.size();j++)
{
for (int i=0; i<m_iCapacity;i++)
{
getValueFromMatrix(preVec[j],i,value);
if (value == 0)
{
continue;
}
else
{
if (!m_pNodeArray[i].m_bIsVisited)
{
cout << i << ":" << m_pNodeArray[i].m_cData << " ";
m_pNodeArray[i].m_bIsVisited = true;
curVec.push_back(i);
}
else
{
continue;
}
}
}
}
if (curVec.size() == 0)
{
return;
}
else
{
breadthFirstTraverseImpl(curVec);
}
}
demo.cpp文件
#include "Cmap.h"
#include <iostream>
using namespace std;
int main()
{
Cmap *pMap = new Cmap(10);
Node *pNodeA = new Node('A');
Node *pNodeB = new Node('B');
Node *pNodeC = new Node('C');
Node *pNodeD = new Node('D');
Node *pNodeE = new Node('E');
Node *pNodeF = new Node('F');
Node *pNodeG = new Node('G');
Node *pNodeH = new Node('H');
pMap->addNode(pNodeA);
pMap->addNode(pNodeB);
pMap->addNode(pNodeC);
pMap->addNode(pNodeD);
pMap->addNode(pNodeE);
pMap->addNode(pNodeF);
pMap->addNode(pNodeG);
pMap->addNode(pNodeH);
pMap->setValueToMatrixForUndirectedGraph(0,1);
pMap->setValueToMatrixForUndirectedGraph(0,3);
pMap->setValueToMatrixForUndirectedGraph(1,2);
pMap->setValueToMatrixForUndirectedGraph(1,5);
pMap->setValueToMatrixForUndirectedGraph(2,4);
pMap->setValueToMatrixForUndirectedGraph(3,6);
pMap->setValueToMatrixForUndirectedGraph(3,7);
pMap->setValueToMatrixForUndirectedGraph(4,5);
pMap->setValueToMatrixForUndirectedGraph(6,7);
pMap->printMatrix();
cout << endl;
pMap->depthFirstTraverse(0);
pMap->resetNode();
cout << endl;
cout << endl;
pMap->breadthFirstTraverse(0);
cout << endl;
delete pMap;
pMap = NULL;
system("pause");
return 0;
}