程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 數據結構_1.順序鏈表

數據結構_1.順序鏈表

編輯:C#入門知識

所有的鏈表都應該有一下功能:

 (1)獲取鏈表長度

 (2)清楚鏈表全部項

 (3)判斷鏈表是否為空

 (4)判斷鏈表是否已滿

 (5)在鏈表末尾添加新項

 (6)在鏈表指定位置插入新項

 (7)在鏈表指定位置刪除項目

 (8)根據輸入項的序號返回鏈表項

 (9)根據輸入列表項的值返回該項的序號

 在這裡定義一個借口,約束所有的鏈表類都必須實現該借口,列表代碼如下:

 

 interface IListFunction<T>
     {
         int GetLength();
         void Clear();
         bool IsEmpty();
         bool IsFull();
         void Append(T item);
         void Insert(T item, int index);
         void Delete(int index);
         T GetItem(int index);
         int Locate(T value);
     }

 

 順序鏈表實現代碼如下:

   public class SequenceList<T> : IListFunction<T>
    {
        private int max;
        private int last;
        private T[] data;
        public SequenceList(int max)
        {
            data = new T[max];
            this.max = max;
            last = -1;
        }
        /// <summary>
        /// 實現索引器
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T this[int i]
        {
            get { return data[i]; }
            set { data[i] = value; }
        }
        /// <summary>
        /// 獲取順序表長度
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return last + 1;
        }
        /// <summary>
        /// 這裡很奇怪,單純只把list設置為-1可以嗎?
        /// 把list設置為-1,在線性表裡面存儲的數據並沒有清理掉,起始就是線性表裡面的數據無法訪問
        /// 但是線性表裡面的數據還是存在的
        /// </summary>
        public void Clear()
        {
            last = -1;
        }
        /// <summary>
        /// 判斷順序表是否為空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            if (last == -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 判斷順序表是否已滿
        /// </summary>
        /// <returns></returns>
        public bool IsFull()
        {
            if (last == max - 1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 在順序表末尾插入數據
        /// </summary>
        /// <param name="item"></param>
        public void Append(T item)
        {
            if (IsFull())
                throw new Exception("超出索引最大值");
            data[++last] = item;
        }
        /// <summary>
        /// 向順序表指定位置插入新值
        /// </summary>
        /// <param name="item"></param>
        /// <param name="index"></param>
        public void Insert(T item, int index)
        {
            if (IsFull())
                throw new Exception("鏈表已滿,無法插入插入數據");
            if (index < 0 || index > last + 2)
                throw new Exception("插入位置小於零或超出鏈表最大位置");
            if (index == last + 1)
            {
                data[index] = item;
            }
            else
            {
                for (int i = last + 1; i > index; i--)
                {
                    data[i] = data[i - 1];
                }
                data[index] = item;
            }
            ++last;
            if (AddItem != null)
            {
                ItemArgs e = new ItemArgs(index, item);
                AddItem(this, e);
            }
        }
        /// <summary>
        /// 刪除順序表指定位置的值
        /// </summary>
        /// <param name="index"></param>
        public void Delete(int index)
        {
            if (index < 0 || index > last + 1)
                throw new Exception("需要刪除項的索引超出界限");
            if (IsEmpty())
                throw new Exception("數據表內沒有任何項,無法刪除");
            if (index == max - 1)
                last = max - 2;
            else
            {
                for (int i = index; i < last; i++)
                {
                    data[i] = data[i + 1];
                }
                --last;
            }
            if (AddItem != null)
            {
                ItemArgs e = new ItemArgs(index);
                AddItem(this, e);
            }
        }
        /// <summary>
        /// 根據順序表位置輸入值
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T GetItem(int index)
        {
            if (index < 0 || index > last)
                throw new Exception("無法獲取,索引超出界限");
            return data[index];
        }
        /// <summary>
        /// 根據值查找該值在順序表中的位置
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public int Locate(T value)
        {
            int resault = -1;
            for (int i = 0; i <= last; i++)
            {
                if (data[i].Equals(value))
                {
                    resault = i;
                    break;
                }
            }
            return resault;
        }

}


摘自 魯信的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved