博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构基础(20) --图的存储结构
阅读量:6962 次
发布时间:2019-06-27

本文共 4068 字,大约阅读时间需要 13 分钟。

图的结构定义

    图是由一个顶点集 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 
class Vertex{public: Vertex(const Type &_node = Type()) : node(_node) {}private: Type node;};//图template
class Graph{public: Graph(); ~Graph(); void addVertex(const Type &vertex); void addEdge(int start, int end); void printMatrix();private: Vertex
* vertexList[MAX_VERTS]; int nVerts; int adjMatrix[MAX_VERTS][MAX_VERTS];};
template 
Graph
::Graph():nVerts(0){ for (int i = 0; i < MAX_VERTS; ++i) for (int j = 0; j < MAX_VERTS; ++j) adjMatrix[i][j] = 0;}template
Graph
::~Graph(){ for (int i = 0; i < nVerts; ++i) delete vertexList[i];}
template 
void Graph
::addVertex(const Type &vertex){ vertexList[nVerts ++] = new Vertex
(vertex);}template
void Graph
::addEdge(int start, int end){ //无向图 adjMatrix[start][end] = 1; adjMatrix[end][start] = 1;}
template 
void Graph
::printMatrix(){ for (int i = 0; i < nVerts; ++i) { for (int j = 0; j < nVerts; ++j) cout << adjMatrix[i][j] << ' '; cout << endl; }}

//测试代码int main(){    Graph
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 
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
*headNode; int size; int nVertex;};
template 
Graph
::Graph(int _size):size(_size), nVertex(0){ vertexList = new Type[size]; headNode = new list
[size];}template
Graph
::~Graph(){ delete []vertexList; delete []headNode;}
template 
void Graph
::addVertex(const Type &vertex){ vertexList[nVertex ++] = vertex;}template
void Graph
::addEdge(int start, int end){ headNode[start].push_back(end);}
template 
void Graph
::printVertex(){ cout << vertexList[0]; for (int i = 1; i < nVertex; ++i) cout << ' ' << vertexList[i]; cout << endl;}template
void Graph
::printAdjList(){ for (int i = 0; i < nVertex; ++i) { cout << i; for (list
::iterator iter = headNode[i].begin(); iter != headNode[i].end(); ++iter) cout << " -> " << *iter; cout << endl; }}
//测试代码int main(){    Graph
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;}

你可能感兴趣的文章
网游高层离职潮例行上演:多数选择创业
查看>>
赛门铁克 BE12.5备份exchange 2010 dag问题
查看>>
如何在Root的手机上开启ViewServer,使得HierachyViewer能够连接
查看>>
mysql 导出数据
查看>>
2014-10-10 LAMP第一部分-环境搭建
查看>>
iPhone 4S
查看>>
Attribute listkey invalid for tag checkboxlist according to TLD
查看>>
IOS 的UINavigatonBar控件的titleTextAttributes的字典类型的属性
查看>>
项目实现
查看>>
查看linux系统版本是32位的还是64位的
查看>>
The Little Prince-12/09
查看>>
ios数据存储4种
查看>>
统计字符串在文件中出现的次数
查看>>
QtCreator源码分析(一)——QtCreator源码简介
查看>>
Java基础学习总结(9)——this关键字
查看>>
Enum简单例子DropdownList
查看>>
c#导出bugfree3.0的数据到禅道
查看>>
SpringMVC权限管理
查看>>
Java Web学习总结(18)——JSP标签
查看>>
成员设计准则
查看>>