数据结构:图 C++实现
2016-05-26 22:29
435 查看
最近在互联网上搜了搜图的数据结构C++的实现,发现大多实现方式过于复杂、繁琐,所以选择自己实现了图的数据结构。
图的数据结构可以使用邻接矩阵、邻接表实现,邻接表其实就是存放一个链表的数组。
CGraph类采用了邻接表方式,使用了STL中的vecctor、list实现。
图的数据结构可以使用邻接矩阵、邻接表实现,邻接表其实就是存放一个链表的数组。
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(); } } }
相关文章推荐
- 数据结构基础知识(二)
- 大话数据结构与算法:算法初步1
- 队列及栈相关题目的实现
- 各种排序算法总结
- 数据结构之排序一
- 数据结构 第十章 内部排序之插入排序
- 数据结构 第十章 内部排序简介
- 数据结构课后题目源码
- caffe中Blob数据结构
- 【数据结构】非比较排序的算法实现(包括计数排序、计数排序)
- 数据结构与算法 —— 向量的扩容策略与分摊时间复杂度
- 顺序表的算法操作
- 【2117】数据结构实验之链表二:逆序建立链表
- 【2116】数据结构实验之链表一:顺序建立链表
- 数据结构->直接插入排序
- 大话数据结构与算法:基础篇
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- [置顶] 【数据结构】 二叉树
- [置顶] 【数据结构】 栈
- [置顶] 【数据结构】 一个数组实现两个栈【面试】