码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构】 List 简单实现

时间:2014-11-04 19:02:00      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   os   for   sp   数据   div   on   

   public class XList<T> : IEnumerable, IEnumerator
    {
        #region List 简单实现

        /// <summary>
        /// 存储数据 数组
        /// </summary>
        private T[] _items;

        /// <summary>
        /// 默认容量
        /// </summary>
        private const int DefaultLength = 4;

        /// <summary>
        /// 插入最后一个元素索引(初始化时没有元素,所以为 -1)
        /// </summary>
        private int _lastIndex = -1;

        /// <summary>
        /// 无参构造
        /// </summary>
        public XList()
        {
            _items = new T[DefaultLength];
        }

        /// <summary>
        /// 带初始容量的构造
        /// </summary>
        /// <param name="length"></param>
        public XList(int length)
        {
            if (length <= 0)
            {
                throw new Exception("长度必须大于0");
            }
            _items = new T[length];
        }

        /// <summary>
        /// 索引器
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T this[int index]
        {
            get
            {
                CheckIndex(index); // 验证索引越界
                return _items[index];
            }
            set { Insert(index, value); }
        }

        /// <summary>
        /// 添加元素
        /// </summary>
        /// <param name="t"></param>
        public void Add(T t)
        {
            Insert(_lastIndex + 1, t);
        }

        /// <summary>
        /// 插入元素
        /// </summary>
        /// <param name="index"></param>
        /// <param name="t"></param>
        public void Insert(int index, T t)
        {
            if (index < 0)
            {
                throw new Exception("索引不能小于0");
            }
            KeepCapacity();
            if (index <= _lastIndex) // 插入位置已有元素
            {
                T[] temp = new T[Capacity];
                for (int i = 0; i < index; i++)
                {
                    temp[i] = _items[i];
                }
                temp[index] = t;
                for (int i = index; i <= _lastIndex; i++)
                {
                    temp[i + 1] = _items[i];
                }
                _items = temp;
            }
            else if (index == _lastIndex + 1) // 在末尾插入 
            {
                _items[++_lastIndex] = t;
            }
            else
            {
                throw new Exception("索引越界");
            }
        }

        /// <summary>
        /// 按 索引 移除元素
        /// </summary>
        /// <param name="index"></param>
        public void Remove(int index)
        {
            CheckIndex(index);
            if (index != _lastIndex) // 移除元素不是最后一个元素
            {
                T[] temp = _items;
                for (int i = index; i < _lastIndex; i++)
                {
                    temp[i] = _items[i + 1];
                }
                _items = temp;
            }
            // 移除元素是最后一个元素,不做处理
            _lastIndex--;
        }

        /// <summary>
        /// 集合存储元素数量
        /// </summary>
        /// <returns></returns>
        public int Count()
        {
            return _lastIndex + 1;
        }

        /// <summary>
        /// 清空集合
        /// </summary>
        public void Clear()
        {
            _lastIndex = -1;
        }

        /// <summary>
        /// 集合 容量
        /// </summary>
        private int Capacity
        {
            get
            {
                if (_items != null)
                {
                    return _items.Length;
                }
                return -1;
            }
        }

        /// <summary>
        /// 保证容量充足,如果数组容量不够就重置大小,容量扩大一倍
        /// </summary>
        private void KeepCapacity()
        {
            if (Capacity == -1) // 数组为 null 的情况
            {
                _items = new T[DefaultLength];
                return;
            }
            if (_lastIndex < Capacity - 1) // 容量足够
            {
                return;
            }
            // 容量不够
            int length = Capacity * 2;
            T[] temp = new T[length];
            for (int i = 0; i < this.Capacity; i++)
            {
                temp[i] = _items[i];
            }
            _items = temp;
        }

        /// <summary>
        /// 检查索引越界的情况
        /// </summary>
        /// <param name="index"></param>
        private void CheckIndex(int index)
        {
            if (index > _lastIndex)
            {
                throw new Exception("索引越界");
            }
        }

        #endregion

        #region 实现枚举

        #region IEnumerable 成员

        public IEnumerator GetEnumerator()
        {
            return this;
        }

        #endregion

        #region IEnumerator 成员

        private int _position = -1;

        public object Current
        {
            get { return _items[_position]; }
        }

        public bool MoveNext()
        {
            if (_position < _lastIndex)
            {
                _position++;
                return true;
            }
            return false;
        }

        public void Reset()
        {
            _position = -1;
        }

        #endregion

        #endregion
    }

算是比较简单的 List 的实现,暂时先这样,有些地方还得完善,
知识点 : 索引器,枚举器,其他的都比较简单

 

【数据结构】 List 简单实现

标签:blog   io   ar   os   for   sp   数据   div   on   

原文地址:http://www.cnblogs.com/fzz2727551894/p/4074098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!