且听风吟

疯狂的IT菜鸟巢

博客园 首页 联系 订阅 管理

      c#中的泛型集合类用起来十分的方便快捷。在这篇随笔里面,我将用链表来模拟c#中的 List<T> 类的行为,废话不多说,下面来看我的实现代码,代码中已经写了注释,所以不再对代码进行额外的说明:

using System.Collections;

 class MyList<T>
    {
        private MyListNode firstNode;//首节点
        private int count;//节点计数
 
        public MyList()
        {
            this.firstNode = null;
            this.count = 0;
        }
        //得到List长度
        public int GetLength()
        {
            return this.count;
        }

        //增加一个节点
        public void AddElement(T data)
        {
            MyListNode first = this.firstNode;
            if(first==null)
            {
                this.firstNode=new MyListNode(data);
                this.count++;
                return;
            }
            while (first.next != null)
            {
                first = first.next;
            }
            first.next = new MyListNode(data);
            this.count++;
        }

        //删除一个节点
        public bool Remove(T data)
        {
            MyListNode first = this.firstNode;
            if (first.data.Equals(data))
            {
                this.firstNode = first.next;
                this.count--;
                return true;
            }
            while (first.next!=null)
            {
                if (first.next.data.Equals(data))
                {
                    first.next = first.next.next;
                    this.count--;
                    return true;
                }
            }
            return false;
        }

        //得到指定索引上的集合元素
        public T GetAtIndex(int index)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            else
            {
                while (innercount < index)
                {
                    first = first.next;
                    innercount++;
                }
                return first.data;
            }
        }

        //在指定的索引上插入新的元素
        public void InsertAtIndex(int index,T data)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            if (index == 1)
            {
                this.firstNode = new MyListNode(data);
                this.firstNode.next = first;
            }
            else
            {
                while (innercount < index - 1)
                {
                    first = first.next;
                    innercount++;
                }
                MyListNode newNode = new MyListNode(data);
                newNode.next = first.next;
                first.next = newNode;
            }
            this.count++;
        }

        //删除指定索引上的集合元素
        public void RemoveAtIndex(int index)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            if (index == 1)
            {
                this.firstNode = first.next;
            }
            else
            {
                while (innercount < index - 1)
                {
                    first = first.next;
                    innercount++;
                }
                first.next = first.next.next;
            }
            this.count--;
        }

        //删除集合中的所有元素
        public void RemoveAll()
        {
            this.firstNode = null;
            this.count = 0;
        }

        //为实现该集合类能用foreach进行遍历
        public IEnumerator GetEnumerator()
        {
            MyListNode first = this.firstNode;
            while (first!= null)
            {
                yield return first.data;
                first = first.next;
            }
        }

        //内部节点类
        private class MyListNode
        {
            public T data { get; set; }//节点上的元素值
            public MyListNode next { get; set; }//节点的下一个节点
            public MyListNode(T nodeData)
            {
                this.data = nodeData;
                this.next = null;
            }
        }
    }

         下面是对这个模拟类的使用:

class Program
    {
        static void Main(string[] args)
        {
            MyList<string> ml = new MyList<string>();
            ml.AddElement("xu");
            ml.AddElement("jin");
            ml.AddElement("lin");
            ml.AddElement("love");
            ml.AddElement("jasmine");
            ml.InsertAtIndex(4, "fiercely");
            ml.RemoveAtIndex(2);
            ml.Remove("lin");
            foreach (string s in ml)
            {
                Console.WriteLine(s);
            }
        }
    }

     

posted on 2009-03-26 11:29  微风吟  阅读(1035)  评论(3编辑  收藏  举报