鱼遇于池,池涸,相濡以沫,相鞠以湿,不若相忘于海。

while (alive) {
  object state = working & fighting & enjoying & living thanksgiving;
}
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数据结构——单链表的定义以及使用(三)

Posted on 2005-07-19 16:03  alittlefish  阅读(927)  评论(4编辑  收藏  举报

进阶功能实现

1. 复制(实现ICollection.CopyTo)

 1public void CopyTo(Array array, int index)
 2{
 3    if (array == null)
 4    {
 5        throw new NullReferenceException();
 6    }

 7    else if (index < 0)
 8    {
 9        throw new ArgumentOutOfRangeException();
10    }

11    else if (array.Rank != 1 || array.Length - index != this._nodeCount || array.Length <= index)
12    {
13        throw new ArgumentException();
14    }

15
16    ListNode node = this._head;
17
18    while (node.NextNode != null)
19    {
20        array[index] = node.NextNode.Data;
21        node = node.NextNode;
22        index++;
23    }

24    
25}

 

2. 对foreach的支持

VB中的For Each是个很强大的遍历方法,要实现这个功能,链表类必须实现IEnumerable接口,IList接口本身也是由该接口继承而来,所以这里不必要显示继承。C#语言从VB中吸取了这个非常实用的语句(写法为foreach)。对所有支持IEnumerable接口的类的实例,foreach语句使用统一的接口遍历其子项,使得以前冗长的for循环中繁琐的薄记工作完全由编译器自动完成。支持IEnumerable接口的类通常用一个内嵌类实现IEnumerator接口,并通过IEnumerable.GetEnumerator函数,允许类的使用者如foreach语句完成遍历工作。

为了对接口IEnumerable提供支持,我这里需要新建一个实现该接口的SingleLinkedListEnumerator类,定义如下:

 1public class SingleLinkedListEnumerator : IEnumerator
 2{
 3    protected int _index;
 4    protected SingleLinkedList _list;
 5    
 6    public SingleLinkedListEnumerator(SingleLinkedList list)
 7    {
 8        this._list = list;
 9        this._index = -1;
10    }

11
12    #region IEnumerator 成员
13
14    public void Reset()
15    {
16        this._list = -1;
17    }

18
19    public object Current
20    {
21        get
22        {
23            // 验证索引的有效性。
24            if (this._index < -1 || this._index > this._list.Count - 1)
25            {
26                throw new ArgumentException("参数越界");
27            }

28            else if (this._index == -1)
29            {
30                throw new InvalidOperationException("在没有调用MoveNext前访问Current是无效的");
31            }

32            else if (this._index >= this._list.Count)
33            {
34                throw new InvalidOperationException("已到集合尾部,访问无效");
35            }

36
37            return this._list[this._index];
38        }

39    }

40
41    public bool MoveNext()
42    {
43        // 验证索引的有效性。
44        this._index ++;
45        if (this._index > this._list.Count - 1)
46        {
47            return false;
48        }

49        else
50        {
51            return true;
52        }

53    }

54
55    #endregion

56}

 

实现IEnumerable.GetEnumerator

1public IEnumerator GetEnumerator()
2{
3    return new SingleLinkedListEnumerator(this);
4}

未完待续。。。