您的位置:首页 > 理论基础 > 数据结构算法

数据结构:图 C++实现

2016-05-26 22:29 435 查看
最近在互联网上搜了搜图的数据结构C++的实现,发现大多实现方式过于复杂、繁琐,所以选择自己实现了图的数据结构。

图的数据结构可以使用邻接矩阵、邻接表实现,邻接表其实就是存放一个链表的数组。

CGraph类采用了邻接表方式,使用了STL中的vecctor、list实现。

#pragma once
#include <list>
#include <queue>
#include <vector>
#include <map>
using namespace std;
class CGraph
{
public:
CGraph(void);
~CGraph(void);
void test();
void addVertex(int iVertex);
void addEdge(int from, int to);
void printGraph();
void BFT();
private:
vector<list<int>*> m_vecListHead;
map<int, int> m_V2Visit;
queue<int> m_queue;
};


#include "StdAfx.h"
#include "Graph.h"

CGraph::CGraph(void)
{
}

CGraph::~CGraph(void)
{
int size = m_vecListHead.size();
for (int i=0; i < size; i++)
{
list<int>* plist = m_vecListHead[i];
if (plist)
{
delete plist;
}
}
m_vecListHead.clear();
}
void CGraph::test()
{
addEdge(0,1);
addEdge(0,2);
addEdge(1,5);
addEdge(1,3);
addEdge(3,4);
addEdge(2,4);
addEdge(2,6);
printGraph();
BFT();
}

void CGraph::addVertex(int iVertex)
{
list<int>* plist = new list<int>;
plist->push_back(iVertex);
m_vecListHead.push_back(plist);
}

void CGraph::addEdge(int from, int to)
{
bool bExit = false;
for (int i=0; i < m_vecListHead.size(); i++)
{
list<int>::iterator itr =m_vecListHead[i]->begin();
if (from==*itr)
{
bExit= true;
break;
}
continue;
}
if (!bExit)
{
addVertex(from);
}

for (int i=0; i < m_vecListHead.size(); i++)
{
list<int>::iterator itr =m_vecListHead[i]->begin();
if (from==*itr)
{
m_vecListHead[i]->push_back(to);
}
}
}

void CGraph::printGraph()
{
for (int i =0; i < m_vecListHead.size(); i++)
{
list<int>*  plist = m_vecListHead[i];
list<int>::iterator itr = plist->begin();
while(itr != plist->end())
{
printf("%d", *itr);
m_V2Visit[*itr]=0;
if ((++itr) != plist->end())
{
printf("->");
}
else
{
printf("->null");
}
--itr;
itr++;
}
printf("\n");
}
}

void CGraph::BFT()
{
for (int i=0; i < m_vecListHead.size();i++)
{
list<int>* plist = m_vecListHead[i];
m_queue.push(*plist->begin());
int iNodeName;
while(m_queue.size()>0)
{
iNodeName = m_queue.front();
if(m_V2Visit[iNodeName] == 0){
printf("%d ",iNodeName);
m_V2Visit[iNodeName] = 1;
list<int>* plist =NULL;
bool bDo = false;
for (int i=0; i < m_vecListHead.size(); i++)
{
if (*m_vecListHead[i]->begin() == iNodeName)
{
plist  = m_vecListHead[i];
bDo = true;
break;
}
}

if (!bDo)
{
continue;
}
list<int>::iterator itr = plist->begin();
itr++;
while(itr != plist->end())
{
m_queue.push(*itr);
itr++;
}
}
m_queue.pop();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: