打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《转》C#与数据结构--图的遍历 - UP GO!!!的日志 - 网易博客
《转》C#与数据结构--图的遍历
默认分类 2008-06-16 13:47:00 阅读7 评论0   字号:大中小
C#与数据结构--图的遍历
8.2 图的存储结构
图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多常用的图的存储结构有邻接矩阵邻接表十字链表和邻接多重表
8.2.1 邻接矩阵表示法
对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系图8.10和图8.11中,矩阵A(i,j)=1表示图中存在一条边(Vi,Vj),而A(i,j)=0表示图中不存在边(Vi,Vj)实际编程时,当图为不带权图时,可以在二维数组中存放bool值,A(i,j)=true表示存在边(Vi,Vj),A(i,j)=false表示不存在边(Vi,Vj);当图带权值时,则可以直接在二维数组中存放权值,A(i,j)=null表示不存在边(Vi,Vj)
图8.10所示的是无向图的邻接矩阵表示法,可以观察到,矩阵延对角线对称,即A(i,j)= A(j,i)无向图邻接矩阵的第i行或第i列非零元素的个数其实就是第i个顶点的度这表示无向图邻接矩阵存在一定的数据冗余
图8.11所示的是有向图邻接矩阵表示法,矩阵并不延对角线对称,A(i,j)=1表示顶点Vi邻接到顶点Vj;A(j,i)=1则表示顶点Vi邻接自顶点Vj两者并不象无向图邻接矩阵那样表示相同的意思有向图邻接矩阵的第i行非零元素的个数其实就是第i个顶点的出度,而第i列非零元素的个数是第i个顶点的入度,即第i个顶点的度是第i行和第i列非零元素个数之和
由于存在n个顶点的图需要n2个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将出现大量零元素,照成极大地空间浪费,这时应该使用邻接表表示法存储图中的数据
8.2.2 邻接表表示法
图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中如图8.12所示,表结点存放的是邻接顶点在数组中的索引对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点
有向图的邻接表有出边表和入边表(又称逆邻接表)之分出边表的表结点存放的是从表头结点出发的有向边所指的尾顶点;入边表的表结点存放的则是指向表头结点的某个头顶点如图8.13所示,图(b)和(c)分别为有向图(a)的出边表和入边表
以上所讨论的邻接表所表示的都是不带权的图,如果要表示带权图,可以在表结点中增加一个存放权的字段,其效果如图8.14所示
注意:观察图8.14可以发现,当删除存储表头结点的数组中的某一元素,有可能使部分表头结点索引号的改变,从而导致大面积修改表结点的情况发生可以在表结点中直接存放指向表头结点的指针以解决这个问题(在链表中存放类实例即是存放指针,但必须要保证表头结点是类而不是结构体)在实际创建邻接表时,甚至可以使用链表代替数组存放表头结点或使用顺序表存代替链表存放表结点对所学的数据结构知识应当根据实际情况及所使用语言的特点灵活应用,切不可生搬硬套
例8-1 AdjacencyList.cs图的邻接表存储结构
1  &65279;using System;
2  using System.Collections.Generic;
3  public classAdjacencyList<T>
4  {
5      List<Vertex<T>>items; //图的顶点集合
6      public AdjacencyList() : this(10) { } //构造方法
7      public AdjacencyList(int capacity) //指定容量的构造方法
8      {
9          items = newList<Vertex<T>>(capacity);
10     }
11     public void AddVertex(T item) //添加一个顶点
12     {  //不允许插入重复值
13         if (Contains(item))
14         {
15             throw new ArgumentException("插入了重复顶点!");
16         }
17         items.Add(newVertex<T>(item));
18     }
19     public void AddEdge(T from, T to) //添加无向边
20     {
21         Vertex<T> fromVer = Find(from);//找到起始顶点
22         if (fromVer == null)
23         {
24             throw new ArgumentException("头顶点并不存在!");
25         }
26         Vertex<T> toVer = Find(to);//找到结束顶点
27         if(toVer == null)
28         {
29             throw new ArgumentException("尾顶点并不存在!");
30         }
31         //无向边的两个顶点都需记录边信息
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据结构
图解九大常见的数据结构!
邻接表
深度优先搜索和广度优先搜索   当我们在学习和临摹垃圾回收(Garbage Collection, 缩写为 GC)相关算法和源码时候, 内在细节离不开这两大类搜索算法支撑. 这就是构建的背景❉, 文章定位是科普扫盲❤.0. 引述与
图的存储
数据结构图
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服