您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础温故-5.图(上):图的基本概念

2015-07-25 14:52 681 查看
前面几篇已经介绍了线性表和树两类数据结构,线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。现实生活中的很多事物都可以抽象为图,例如世界各地接入Internet的计算机通过网线连接在一起,各个城市和城市之间的铁轨等等。

[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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: