数据结构基础(20) --图的存储结构
来源:互联网 发布:淘宝如何用图片搜索 编辑:程序博客网 时间:2024/05/10 12:01
图的结构定义
图是由一个顶点集 V 和一个弧集 E构成的数据结构。
Graph = (V , E )
其中,E = {<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。谓词 P(v,w) 定义了弧 <v,w>的意义或信息。
由顶点集和边集构成的图称作无向图。
如果”弧”是有方向的,则称由顶点集和弧集构成的图为有向图。
邻接矩阵
定义:矩阵的元素为
有向图的邻接矩阵为非对称矩阵, 而无向图的邻接矩阵为对称矩阵;
//无向图的邻接矩阵const int MAX_VERTS = 20;//顶点template <typename Type>class Vertex{public: Vertex(const Type &_node = Type()) : node(_node) {}private: Type node;};//图template <typename Type>class Graph{public: Graph(); ~Graph(); void addVertex(const Type &vertex); void addEdge(int start, int end); void printMatrix();private: Vertex<Type>* vertexList[MAX_VERTS]; int nVerts; int adjMatrix[MAX_VERTS][MAX_VERTS];};
template <typename Type>Graph<Type>::Graph():nVerts(0){ for (int i = 0; i < MAX_VERTS; ++i) for (int j = 0; j < MAX_VERTS; ++j) adjMatrix[i][j] = 0;}template <typename Type>Graph<Type>::~Graph(){ for (int i = 0; i < nVerts; ++i) delete vertexList[i];}
template <typename Type>void Graph<Type>::addVertex(const Type &vertex){ vertexList[nVerts ++] = new Vertex<Type>(vertex);}template <typename Type>void Graph<Type>::addEdge(int start, int end){ //无向图 adjMatrix[start][end] = 1; adjMatrix[end][start] = 1;}
template <typename Type>void Graph<Type>::printMatrix(){ for (int i = 0; i < nVerts; ++i) { for (int j = 0; j < nVerts; ++j) cout << adjMatrix[i][j] << ' '; cout << endl; }}
//测试代码int main(){ Graph<char> g; g.addVertex('A'); //0 g.addVertex('B'); //1 g.addVertex('C'); //2 g.addVertex('D'); //3 g.addVertex('E'); //4 g.addEdge(0, 1); //A-B g.addEdge(0, 3); //A-D g.addEdge(1, 0); //B-A g.addEdge(1, 4); //B-E g.addEdge(2, 4); //C-E g.addEdge(3, 0); //D-A g.addEdge(3, 4); //D-E g.addEdge(4, 1); //E-B g.addEdge(4, 2); //E-C g.addEdge(4, 3); //E-D g.printMatrix(); return 0;}
邻接表
注意:在有向图的邻接表中不易找到指向该顶点的弧。
//无向图的邻接表template <typename Type>class Graph{public: Graph(int _size = 10); ~Graph(); void addVertex(const Type &vertex); void addEdge(int start, int end); void printVertex(); void printAdjList();private: Type *vertexList; list<int> *headNode; int size; int nVertex;};
template <typename Type>Graph<Type>::Graph(int _size):size(_size), nVertex(0){ vertexList = new Type[size]; headNode = new list<int>[size];}template <typename Type>Graph<Type>::~Graph(){ delete []vertexList; delete []headNode;}
template <typename Type>void Graph<Type>::addVertex(const Type &vertex){ vertexList[nVertex ++] = vertex;}template <typename Type>void Graph<Type>::addEdge(int start, int end){ headNode[start].push_back(end);}
template <typename Type>void Graph<Type>::printVertex(){ cout << vertexList[0]; for (int i = 1; i < nVertex; ++i) cout << ' ' << vertexList[i]; cout << endl;}template <typename Type>void Graph<Type>::printAdjList(){ for (int i = 0; i < nVertex; ++i) { cout << i; for (list<int>::iterator iter = headNode[i].begin(); iter != headNode[i].end(); ++iter) cout << " -> " << *iter; cout << endl; }}
//测试代码int main(){ Graph<char> g; g.addVertex('A'); //0 g.addVertex('B'); //1 g.addVertex('C'); //2 g.addVertex('D'); //3 g.addVertex('E'); //4 g.printVertex(); g.addEdge(0, 1); //A-B g.addEdge(0, 3); //A-D g.addEdge(1, 0); //B-A g.addEdge(1, 4); //B-E g.addEdge(2, 4); //C-E g.addEdge(3, 0); //D-A g.addEdge(3, 4); //D-E g.addEdge(4, 1); //E-B g.addEdge(4, 2); //E-C g.addEdge(4, 3); //E-D g.printAdjList(); return 0;}
2 0
- 数据结构基础(20) --图的存储结构
- 数据结构基础(20) --图的存储结构
- 数据结构基础之图的存储结构
- 【数据结构基础】栈的链式存储结构
- 【数据结构基础】队列的链式存储结构
- 数据结构---->图的存储结构
- 数据结构 - 图的存储结构
- 数据结构---图的存储结构
- 【数据结构】图的存储结构
- 【数据结构基础】线性表的顺序存储结构
- 【数据结构基础】线性表的链式存储结构--单链表
- 数据结构:图的存储结构之邻接矩阵
- 11.20数据结构----图的存储结构
- 数据结构(十九)图的存储结构
- 数据结构:图的存储结构之邻接矩阵
- 数据结构:图的存储结构之邻接矩阵
- 数据结构(图的存储结构)
- 【数据结构基础】栈--顺序存储结构
- JSON简介
- Android手机自动化测试实例详解
- iOS 开发之:iOS字体设置
- IOS学习之——地图3 调用苹果地图
- 11.3.4 F# 中的延迟值
- 数据结构基础(20) --图的存储结构
- NOX控制器添加自定义应用的方法
- C# chart控件运用
- activiti根据当前节点获取下一步任务节点
- ORA-04031案例一则(非常详细的解释)
- win7/win8/win8.1下JDK安装与配置
- AFNetworking 2.0
- bzoj3172_AC自动机
- yii2 动作命名时要统一规范