数据结构基础温故-5.图(上):图的基本概念
2015-07-25 14:52
681 查看
前面几篇已经介绍了线性表和树两类数据结构,线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。现实生活中的很多事物都可以抽象为图,例如世界各地接入Internet的计算机通过网线连接在一起,各个城市和城市之间的铁轨等等。
[b]
View Code
这里判断了是否是有向图,如果是有向图则显示A→B的形式,如果是无向图则显示A:B的形式。
这里我们对基本功能做一下测试,分为无向图和有向图,首先插入顶点及对应边,然后打印顶点及其邻接表的信息,要构造的无向图与有向图如上面两张图所示,测试代码如下所示:
运行结果如下图所示:
(2)陈广,《数据结构(C#语言描述)》
(3)段恩泽,《数据结构(C#语言版)》
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
[b]
/// <summary> /// 打印打印每个顶点和它的邻接点 /// </summary> /// <param name="isDirectedGraph">是否是有向图</param> public string GetGraphInfo(bool isDirectedGraph = false) { StringBuilder sb = new StringBuilder(); foreach (Vertex<T> v in items) { sb.Append(v.data.ToString() + ":"); if (v.firstEdge != null) { Node temp = v.firstEdge; while (temp != null) { if (isDirectedGraph) { sb.Append(v.data.ToString() + "→" + temp.adjvex.data.ToString() + " "); } else { sb.Append(temp.adjvex.data.ToString()); } temp = temp.next; } } sb.Append("\r\n"); } return sb.ToString(); }
View Code
这里判断了是否是有向图,如果是有向图则显示A→B的形式,如果是无向图则显示A:B的形式。
3.3 基本功能测试
这里我们对基本功能做一下测试,分为无向图和有向图,首先插入顶点及对应边,然后打印顶点及其邻接表的信息,要构造的无向图与有向图如上面两张图所示,测试代码如下所示:
static void MyAdjacencyListTest() { Console.WriteLine("------------无向图------------"); MyAdjacencyList<string> adjList = new MyAdjacencyList<string>(); // 添加顶点 adjList.AddVertex("A"); adjList.AddVertex("B"); adjList.AddVertex("C"); adjList.AddVertex("D"); //adjList.AddVertex("D"); // 会报异常:添加了重复的节点 // 添加无向边 adjList.AddEdge("A", "B"); adjList.AddEdge("A", "C"); adjList.AddEdge("A", "D"); adjList.AddEdge("B", "D"); //adjList.AddEdge("B", "D"); // 会报异常:添加了重复的边 Console.Write(adjList.GetGraphInfo()); Console.WriteLine("------------有向图------------"); MyAdjacencyList<string> dirAdjList = new MyAdjacencyList<string>(); // 添加顶点 dirAdjList.AddVertex("A"); dirAdjList.AddVertex("B"); dirAdjList.AddVertex("C"); dirAdjList.AddVertex("D"); // 添加有向边 dirAdjList.AddDirectedEdge("A", "B"); dirAdjList.AddDirectedEdge("A", "C"); dirAdjList.AddDirectedEdge("A", "D"); dirAdjList.AddDirectedEdge("B", "D"); Console.Write(dirAdjList.GetGraphInfo(true)); }
运行结果如下图所示:
附件下载
本篇实现的图的邻接表结构:code.datastructure.graph参考资料
(1)程杰,《大话数据结构》(2)陈广,《数据结构(C#语言描述)》
(3)段恩泽,《数据结构(C#语言版)》
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。