图的邻接表存储结构

程序调用入口

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;
        }
    }
}

执行结果:

时间: 2024-08-17 17:00:35

图的邻接表存储结构的相关文章

在图采用邻接表存储时,求最小生成树的Prime算法的时间复杂度为?

问题描述 在图采用邻接表存储时,求最小生成树的Prime算法的时间复杂度为? 在图采用邻接表存储时,求最小生成树的Prime算法的时间复杂度为? A o(n^2) B o(n^3) C o(n) D o(n+e) 答案是o(n+e)...不理解..求过程 解决方案 不对,这题应该选A 求顶点的入度的时间复杂度为O(e)*n=O(n*e) 遍历顶点的时间复杂度是O(n^2) 相加是O(n^2+n*e)=O(n^2) 解决方案二: 详细的解释http://www.cskaoyan.com/redir

图的邻接表存储 c实现

图的邻接表存储 c实2011-10-07 10:34 4047人阅读 评论(2) 收藏 举报 存储cstruct数据结构null编程   用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化,指针指向null.然后边表插入进来,是插入到前一个,也就是直接插入到firstedge指向的下一个,而后面的后移   [cpp] view plaincopyprint? #define  Ma

图的邻接表存储表示示例讲解_C 语言

复制代码 代码如下: //---------图的邻接表存储表示------- #include<stdio.h>#include<stdlib.h> #define MAX_VERTEXT_NUM 20 typedef int InfoType;typedef char VertextType; typedef struct ArcNode{    int adjvex;    struct ArcNode *nextArc;    InfoType *info;}ArcNode;

C++实现图的邻接表存储和广度优先遍历实例分析_C 语言

本文实例讲述了C++实现图的邻接表存储和广度优先遍历方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 0 2 0 3 2 3 2 4 1 4 输入结束(此行不必输入) 注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示       2 3表示该图的

数据结构实践——操作用邻接表存储的图

本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的一个顶点,输出该顶点编号: (3)计算图G中出度为0的顶点数: (4)判断图G中是否存在边<i,j>. 利用下图作为测试用图,输出结果. 提示:(1)分别设计函数实现算法:(2)不要全部实现完再测试,而是实现一个,测试一个:(3)请利用图算法库. [参考解答] #include <stdi

【算法导论】邻接表存储的拓扑排序

        上一篇文章中讲述了用邻接矩阵存储的图的拓扑排序,下面本文介绍用邻接表存储的图的拓扑排序.         关于拓扑排序的概念及基本思想,我在上一篇文章中已经较为详细的描述了,这里不在介绍.我们知道利用邻接矩阵进行拓扑排序时,程序实现较为简单,但是效率不高,算法的复杂度为O(n^3).而利用邻接表会使入度为0的顶点的操作简化,从而提高算法的效率. 在邻接表存储结构中,为了便于检查每个顶点的入度,可在顶点表中增加一个入度域(id),这样的邻接表如下图所示,这样只需对由n个元素构成的顶

图的邻接表实现 Adjacency List of the Graph

图的邻接表实现 Adjacency List of the Graph eryar@163.com 一.图的邻接表   邻接表(Adjacency List)是图的一种链式存储结构.在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边,对有向图是以顶点Vi为尾的弧.如下图所示的图用邻接表表示如下:    根据上图来定义用邻接表表示图的数据结构.当用邻接表来表示图时,图是由顶点序列组成的,在每个顶点中,记录下与该顶点相连的顶点在顶点序列中的位置.相关的数据结构如下所

关键路径:php实现图的邻接表,关键路径,拓朴排序

<?php//调用require 'algraph.php';$a = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j');$e = array('ab'=>'3', 'ac'=>'4', 'be'=>'6', 'bd'=>'5', 'cd'=>'8', 'cf'=>'7', 'de'=>'3', 'eg'=>'9', 'eh'=>'4', 'fh'=>'6', 'gj'=>

PHP实现图的邻接表

<?php      //调用      require 'alGraph.php';      $a = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j');      $b = array('ab', 'bc', 'be', 'cd', 'df', 'fg', 'gh', 'ga', 'hj', 'gi');        $test = new ALGraph($a, $b);      print_r($test->bfs()