图的邻接表存储结构
程序調用入口:
using System;namespace Graphic_AdjacencyList {internal class Program{private static void Main(string[] args){var adjacencyList = new AdjacencyList<char>();Console.WriteLine("1.初始化樹結構:");Console.WriteLine("=================================");//添加頂點;adjacencyList.AddVertex('A');adjacencyList.AddVertex('B');adjacencyList.AddVertex('C');adjacencyList.AddVertex('D');//添加邊;adjacencyList.AddEdge('A', 'B');adjacencyList.AddEdge('A', 'C');adjacencyList.AddEdge('A', 'D');adjacencyList.AddEdge('B', 'D');adjacencyList.AddEdge('C', 'D');Console.WriteLine("=================================");Console.WriteLine("2.樹的鄰接表遍歷:");Console.WriteLine(adjacencyList.ToString());Console.Read();}} }圖-頂點類: namespace Graphic_AdjacencyList {/// <summary>/// 鏈表中的節點/// </summary>public class Node<T>{/// <summary>/// 鄰接點域/// </summary>public Vertex<T> Adjvex;/// <summary>/// 下一個鄰接點指針域/// </summary>public Node<T> Next;/// <summary>/// 鏈表中的節點/// </summary>/// <param name="value"></param>public Node(Vertex<T> value){Adjvex = value;}} }圖-鏈表中的表頭節點類: using System;namespace Graphic_AdjacencyList {/// <summary>/// 鏈表中的表頭節點/// </summary>/// <typeparam name="T"></typeparam>public class Vertex<T>{/// <summary>/// 數據/// </summary>public T Data;/// <summary>/// 鄰接表表頭指針/// </summary>public Node<T> FirstEdge;/// <summary>/// 訪問標志,遍歷時使用/// </summary>public Boolean Visited;/// <summary>/// 表頭節點/// </summary>/// <param name="value"></param>public Vertex(T value) //構造方法;{Data = value;}} } ?圖-圖的鄰接表存儲類:using System; using System.Collections.Generic; using System.Linq;namespace Graphic_AdjacencyList {/// <summary>/// 圖的鄰接表存儲類/// </summary>/// <typeparam name="T"></typeparam>public class AdjacencyList<T>{/// <summary>/// 圖的頂點集合/// </summary>private readonly List<Vertex<T>> _items;public AdjacencyList(): this(10){}public AdjacencyList(int capacity){_items = new List<Vertex<T>>(capacity);}/// <summary>/// 添加頂點/// </summary>/// <param name="item"></param>public void AddVertex(T item){if (Contains(item)){throw new ArgumentException("插入了重復頂點!");}_items.Add(new Vertex<T>(item));Console.WriteLine("添加頂點:" + item);}/// <summary>/// 添加無向邊/// </summary>/// <param name="from"></param>/// <param name="to"></param>public void AddEdge(T from, T to){Vertex<T> fromVer = Find(from);if (fromVer == null){throw new ArgumentException("頭頂點不存在!");}Vertex<T> toVer = Find(to);if (toVer == null){throw new ArgumentException("尾頂點不存在!");}//無向邊的兩個頂點都需記錄邊信息;AddDirectedEdge(fromVer, toVer);AddDirectedEdge(toVer, fromVer);Console.WriteLine(string.Format("添加無向邊:{0}—{1}", from, to));}/// <summary>/// 添加有向邊/// </summary>/// <param name="fromVer"></param>/// <param name="toVer"></param>private void AddDirectedEdge(Vertex<T> fromVer, Vertex<T> toVer){if (fromVer.FirstEdge == null) //無臨接點時;{fromVer.FirstEdge = new Node<T>(toVer);}else{Node<T> tem, node = fromVer.FirstEdge;do{if (node.Adjvex.Data.Equals(toVer.Data)){throw new ArgumentException("添加了重復的邊!");}tem = node;node = node.Next;} while (node != null);tem.Next = new Node<T>(toVer); //添加到鏈表末尾;}}public bool Contains(T item){//foreach (Vertex<T> v in _items)//{// if (v.data.Equals(item))// {// return true;// }//}return _items.Any(v => v.Data.Equals(item));}private Vertex<T> Find(T item){//foreach (Vertex<T> v in _items)//{// if (v.data.Equals(item))// {// return v;// }//}return _items.FirstOrDefault(v => v.Data.Equals(item));}public override string ToString(){string result = string.Empty;foreach (var vertex in _items){if (vertex != null){result += string.Format("頂點:{0}:", vertex.Data);if (vertex.FirstEdge != null){Node<T> tem = vertex.FirstEdge;while (tem != null){result += tem.Adjvex.Data.ToString();tem = tem.Next;}}}result += "\r\n";}return result;}} }執行結果:轉載于:https://www.cnblogs.com/zhangqs008/archive/2012/12/02/2802190.html
總結
- 上一篇: Vue 后台管理
- 下一篇: Chapter 5 Blood Type