您的位置:首页 > 其它

图的邻接表存储结构

2012-12-02 20:39 357 查看
程序调用入口

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;
}
}
}
执行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: