静态链表(C#实现)

创建结构:

   public class Link
    {
       public string data;
       public int cur;
    }

创建:

   public class Link_list
    {
        private int _length = 0;
        public int Length
        {
            get { return _length; }
            set { _length = value; }
        }
        static readonly int MAXSIZE = 10;
        public static Link[] _arry;
        public Link_list()
        {
            _arry = new Link[MAXSIZE];
            Init();
        }
        /// <summary>
        /// 初始化静态链表
        /// </summary>
        private void Init()
        {
            for (int i = 0; i < MAXSIZE; i++)
            {
                _arry[i] = new Link();
                _arry[i].cur = i + 1;
            }
            _arry[MAXSIZE - 1].cur = 1;
        }
        /// <summary>
        /// 返回第一个可用的位置
        /// </summary>
        /// <returns></returns>
        private int Mallo_()
        {
            int i = _arry[0].cur;
            if (_arry[0].cur > 0)
            {
                _arry[0].cur = _arry[i].cur;
            }
            return i;
        }
        /// <summary>
        /// 添加一个数据项
        /// </summary>
        /// <param name="l"></param>
        public void Add(Link l)
        {
          int temp=  Mallo_();
          _arry[temp].data = l.data;
          _arry[temp].cur = _arry[0].cur;
          addLength();
        }
        private void addLength()
        {
            _length++;
        }
        private void delteLength()
        {
            _length--;
        }
        /// <summary>
        /// 在指定位置前插入数据
        /// </summary>
        /// <param name="weiz">指定位置</param>
        /// <param name="l">要插入的数据</param>
        public void Insert(int weiz, Link l)
        {
            if (weiz > _arry[0].cur)
            {
                return;
            }
            int free_Length = Mallo_();
            int temp = MAXSIZE - 1;
            for (int i = 1; i <= weiz - 1; i++)
            {
                temp = _arry[temp].cur;
            }
            l.cur = _arry[temp].cur;
            _arry[temp].cur = free_Length;
            _arry[free_Length] = l;
            addLength();
        }
        public void Delete(int weiz)
        {
            if (weiz >= _arry[0].cur)
            {
                return;
            }
            int k = _arry[MAXSIZE-1].cur;
            for (int i = 1; i <weiz-1; i++)
            {
                k = _arry[k].cur;
            }
            //k=1
            //假如我要删除第2个
            //temp=2
            int tmep = _arry[k].cur;//得到第2个的下一个
            _arry[k].cur = _arry[tmep].cur;
            _free(tmep);
            delteLength();
        }
        private void _free(int i)
        {
            _arry[i].cur = _arry[0].cur;
            _arry[i].data = null;
            _arry[0].cur = i;
        }
    }

使用:

        static void Main(string[] args)
        {
            Link_list ls = new Link_list();
            Link l1 = new Link() { data="小花"};
            Link l2 = new Link() { data = "小白" };
            Link l3 = new Link() { data = "小虎" };
            Link l4 = new Link() { data = "小涛" };
            Link l5 = new Link() { data = "小智" };
            ls.Add(l1);
            ls.Add(l2);
            
            ls.Add(l3);
         
            foreach (var item in Link_list._arry)
            {
                Console.WriteLine(string.Format("数据:{0},游标:{1}", item.data, item.cur));
            }
            Console.WriteLine("--------------------------------------------------------------");
            //ls.Delete(2);
            ls.Insert(2, l4);
            foreach (var item in Link_list._arry)
            {
                Console.WriteLine(string.Format("数据:{0},游标:{1}",item.data,item.cur));
            }
            //ls.Insert(1, l1);
            Console.Read();
        }

优点:

  插入时不需要大幅度的移动数组元素

缺点:

  修改时复杂度为0(n)

posted @ 2017-01-10 21:49  夏风微凉  阅读(863)  评论(0编辑  收藏  举报