数据结构:图 C++实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oyj1020/article/details/51511156

最近在互联网上搜了搜图的数据结构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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/Oyj1020/article/details/51511156