Henry手记—.NET数据结构对象补遗之单链表(四)

原创 2003年06月15日 14:38:00

       Henry手记—.NET数据结构对象补遗之单链表(四)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                            韩睿  ( 06/15/2003)

3.10      其他属性

本文并没有全部实现所有的IList接口方法与属性的使用,但还是要声明出来如下四种属性。由于本文的单链表类没有提供内置的线程同步(都说完了,下次说什么呀。呵呵),因此IsSynchronized返回为falseSyncRoot返回的是类实例的引用。枚举数没有对集合的独占访问权;因此,枚举一个集合在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中用SyncLock锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。象SSList类这样的处理,每一次锁定会阻塞全部对象,要提供粒度更小的线程安全,我们以后会继续讨论的。

Public Overridable ReadOnly Property IsSynchronized() As Boolean _

                                Implements IList.IsSynchronized

        Get

            Return False

        End Get

End Property

 

Public Overridable ReadOnly Property SyncRoot() As Object _

                                Implements IList.SyncRoot

        Get

            Return Me

        End Get

End Property

IsFixedSize属性是指通过类实现时,获取一个值,该值指示 IList 是否具有固定大小。链表类没有固定大小,所以返回的当然是false

Public Overridable ReadOnly Property IsFixedSize() As Boolean _

                                Implements IList.IsFixedSize

        Get

            Return False

        End Get

End Property

IsReadOnly属性是指通过类实现时,获取一个指示 IList 是否为只读的值。当然也是返回false喽。

Public Overridable ReadOnly Property IsReadOnly() As Boolean _

                                Implements IList.IsReadOnly

        Get

            Return False

        End Get

End Property

4.        调用示例

在上面我们已经详细分析与列举了SSList类的实现,现在在来看一下它的结构,如图2所示:

                      

             图2 类结构(含两个嵌套类)

那么,怎么样来使用我们的单链表类呢?其实,很容易,与Arraylist类的使用方法相当相近,只是我们不用设定列表的长度而已,在另一个vb文件里,我们来对SLList类进行操作:

'使用示例

 Dim lst As New SLList()

 Try

     lst.Add("Henry") '添加

     lst.Add("jjj")

     lst.Insert(1, "kkk") '插入

     lst.Remove("jjj") '按值删除

     lst.RemoveAt(1) '按索引号删除

     lst(0) = "Jerry" '更改

     Dim i As Integer = lst.IndexOf("jjj") '取索引号

 

     '多种循环遍历

     Dim collectionItem As Object

     Dim loopCounter As Integer

     Dim enumCollection As IEnumerator

     '第一种

     For Each collectionItem In lst

          Console.WriteLine(collectionItem)

     Next

     '第二种

     For loopCounter = 0 To lst.Count - 1

          Console.WriteLine(lst.Item(loopCounter))

     Next

     '第三种

     enumCollection = lst.GetEnumerator()

     Do While enumCollection.MoveNext

         Console.WriteLine(enumCollection.Current)

     Loop

Catch ex As Exception

     MsgBox(ex.ToString)

End Try

现在来看一下version的作用:

     '第三种

     enumCollection = lst.GetEnumerator()

     lst.Add("Kelly")

     Do While enumCollection.MoveNext

         Console.WriteLine(enumCollection.Current)

     Loop

这时您运行一下,就会得到一个异常,提示为:

System.InvalidOperationException: 该链表在枚举器创建后发生了改变

这不正是我们在VerifyListIsUnchanged方法中定义的出错信息吗?现在大家也就明白我们在操作Arraylist或其它.net类出错时,为什么会带有相应的提示文字了吧?象“索引越界”等我们定义过的出错提示在本例中也会被捕捉到。请自行测试。

5.     小结与展望

本文和大家一起深入collections集合类的实现,我们在实际工作中处理列表类时用的是Arraylist(我也是,呵呵)。但是链表的插入、删除的处理效率远高于ArrayList(单链表加上前驱指针会更加提高效率),当然,索引取值的能力不如ArrayList。我们在处理某些频繁删除与插入的列表时,还是值得考虑是否采用链表来实现我们的需求。

限于篇幅与时间,对于排序、同步等ArrayList具有的相应功能没有过多涉及,感兴趣的朋友请继续关注我的专栏。下次再见!

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

 请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/

SDUTOJ 2119 数据结构实验之链表四:有序链表的归并

题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。 输入 第一行输入M与N的值; 第二行...
  • u013014691
  • u013014691
  • 2014年03月06日 19:30
  • 1500

Java数据结构-单链表

本文将数据结构知识中重要知识点:数据元素,结点,数据类型,抽象数据类型,抽象数据类型的实现、以及对新定义的数据结构的应用等知识通过下述java代码的形式串联起来,以从宏观上对数据结构有一个透彻的理解和...
  • wk_learn
  • wk_learn
  • 2014年06月13日 08:43
  • 3368

数据结构单链表的建立的使用

建立单链表的意义: 储存数据 一般就是用的数组,灵活性也是很好的,但是数组的大小必须在开始的时候预先定义好,在未知的情况下就很容易损耗空间; 单链表:...
  • woshinannan741
  • woshinannan741
  • 2015年10月03日 18:02
  • 2426

数据结构之:链表详解

11
  • lishuzhai
  • lishuzhai
  • 2016年03月31日 17:13
  • 12540

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数...
  • u013634961
  • u013634961
  • 2014年12月11日 01:54
  • 902

2015年大二上-数据结构-链表(3)-单链表算法

1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。 /* *C...
  • Annpion
  • Annpion
  • 2015年11月03日 12:28
  • 392

数据结构--单链表的基本操作(C语言实现)

数据结构--单链表的基本操作(C语言实现)     #include #include #define ERROR 0 #define OK   1...
  • qq_33609401
  • qq_33609401
  • 2016年09月27日 17:30
  • 1185

数据结构 - C语言版 - 单链表 所有基本操作

C语言 - 单链表 所有基本操作 #include #include #include typedef struct OLNode { int data; struct OLNode * ...
  • u012495182
  • u012495182
  • 2013年11月11日 17:51
  • 1484

数据结构——单链表的基本操作

链表是线性表物理实现上一种数据
  • dd864140130
  • dd864140130
  • 2014年11月13日 21:55
  • 5553

【数据结构】单链表的基本操作

一、单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 二、单链表的基础用法 这里我们先讲一些简单的、基础的用法 如初始化,销毁,插入元素,求链表长度,打...
  • qq_31828515
  • qq_31828515
  • 2016年06月22日 17:54
  • 1796
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry手记—.NET数据结构对象补遗之单链表(四)
举报原因:
原因补充:

(最多只允许输入30个字)