資料結構C#版筆記–順序表(SeqList)

來源:互聯網
上載者:User

線性結構(Linear Stucture)是資料結構(Data Structure)中最基本的結構,其特徵用圖形表示如下:

即:每個元素前面有且只有一個元素(稱為“前驅”),同樣後面有且只有一個元素(稱為"後繼")--註:起始元素的前驅認為是空,末尾元素的後繼認為也是空,這樣在概念上就不衝突了。

線性表(List)是線性結構的一種典型實現,它又可以分為:順序表(SeqList)和鏈表(LinkList)二大類.

順序表(SeqList)的基本特徵為:元素在內部儲存時是一個接一個在儲存單元中按順序儲存的,所以只要知道"起始元素的儲存地址"--稱為順序表的基地址(Base Address)以及順序表中任何元素的位置(即它是第幾個元素),就能直接定位到該元素的地址,從而直接存取到該元素的值。也就是說儲存/讀取每個元素所用的時間是相同的,即所謂的“隨機存取”

 

C#語言中數組(Array)在記憶體中佔用的就是一組連續的儲存地區,所以用數組來實現順序表再適用不過。

 

先來定義線性表的通用介面IListDS.cs(註:DS為DataStructure的縮寫)

namespace 線性表{    public interface IListDS<T>    {        //取得線性表的實際元素個數        int Count();        //清空線性表        void Clear();        //判斷線性表是否為空白        bool IsEmpty();        //(在末端)追加元素        void Append(T item);        //在位置i“前面”插入元素item        void InsertBefore(T item, int i);        //在位置i“後面”插入元素item        void InsertAfter(T item, int i);        //刪除索引i處的元素        T RemoveAt(int i);        //獲得索引位置i處的元素        T GetItemAt(int i);        //返回元素value的索引        int IndexOf(T value);        //反轉線性表的所有元素        void Reverse();    }}

順序表(SeqList)的實現:

using System;using System.Text;namespace 線性表{    /// <summary>    /// 順序表    /// </summary>    /// <typeparam name="T"></typeparam>    public class SeqList<T> : IListDS<T>    {        private int maxsize;        private T[] data;        private int last;        //類索引器        public T this[int index]        {            get            {                return this.GetItemAt(index);            }            set            {                if (index < 0 || index > last + 1)                {                    Console.WriteLine("Position is error");                    return;                }                data[index] = value;            }        }        //最後一個元素的下標        public int Last        {            get { return last; }        }        //最大容量        public int Maxsize        {            get { return this.maxsize; }            set { this.maxsize = value; }        }        //建構函式        public SeqList(int size)        {            data = new T[size];            maxsize = size;            last = -1;        }        //返回鏈表的實際長度        public int Count()        {            return last + 1;        }        //清空        public void Clear()        {            last = -1;        }        //是否空        public bool IsEmpty()        {            return last == -1;        }        //是否滿        public bool IsFull()        {            return last == maxsize - 1;        }        //(在最後位置)追加元素        public void Append(T item)        {            if (IsFull())            {                Console.WriteLine("List is full");                return;            }            data[++last] = item;        }        /// <summary>        ///前插        /// </summary>        /// <param name="item">要插入的元素</param>        /// <param name="i">要插入的位置索引</param>        public void InsertBefore(T item, int i)        {            if (IsFull())            {                Console.WriteLine("List is full");                return;            }            if (i < 0 || i > last + 1)            {                Console.WriteLine("Position is error");                return;            }            if (i == last + 1)            {                data[last + 1] = item;            }            else            {                //位置i及i以後的元素,全部後移                for (int j = last; j >= i; j--)                {                    data[j + 1] = data[j];                }                data[i] = item;            }            ++last;        }        /// <summary>        /// 後插        /// </summary>        /// <param name="item"></param>        /// <param name="i"></param>        public void InsertAfter(T item, int i)         {            if (IsFull())            {                Console.WriteLine("List is full");                return;            }            if (i < 0 || i > last)            {                Console.WriteLine("Position is error");                return;            }            if (i == last)            {                data[last + 1] = item;            }            else             {                //位置i以後的元素(不含位置i),全部後移                for (int j = last; j > i; j--)                {                    data[j + 1] = data[j];                }                data[i+1] = item;            }            ++last;        }        /// <summary>        /// 刪除元素        /// </summary>        /// <param name="i">要刪除的元素索引</param>        /// <returns></returns>        public T RemoveAt(int i)        {            T tmp = default(T);            if (IsEmpty())            {                Console.WriteLine("List is empty");                return tmp;            }            if (i < 0 || i > last)            {                Console.WriteLine("Position is error!");                return tmp;            }            if (i == last)            {                tmp = data[last];            }            else            {                tmp = data[i];                //位置i以及i以後的元素前移                for (int j = i; j <= last; j++)                {                    data[j] = data[j + 1];                }            }            --last;            return tmp;        }        /// <summary>        /// 擷取第幾個位置的元素        /// </summary>        /// <param name="i">第幾個位置</param>        /// <returns></returns>        public T GetItemAt(int i)        {            if (IsEmpty() || (i < 0) || (i > last))            {                Console.WriteLine("List is empty or Position is error!");                return default(T);            }            return data[i];        }        /// <summary>        /// 定位元素的下標索引        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        public int IndexOf(T value)        {            if (IsEmpty())            {                Console.WriteLine("List is Empty!");                return -1;            }            int i = 0;            for (i = 0; i <= last; i++)            {                if (value.Equals(data[i]))                {                    break;                }            }            if (i > last)            {                return -1;            }            return i;        }        /// <summary>        /// 元素反轉        /// </summary>        public void Reverse()        {            T tmp = default(T);            for (int i = 0; i <= last / 2; i++)            {                tmp = data[i];                data[i] = data[last-i];                data[last-i] = tmp;            }        }        public override string ToString()        {            StringBuilder sb = new StringBuilder();            for (int i = 0; i <= last; i++)            {                sb.Append(data[i].ToString() + ",");            }            return sb.ToString().TrimEnd(',');        }    }}

測試程式碼片段:

            Console.WriteLine("順序表測試開始...");            SeqList<string> seq = new SeqList<string>(10);                     seq.Append("x");            seq.InsertBefore("w", 0);            seq.InsertBefore("v", 0);            seq.Append("y");            seq.InsertBefore("z", seq.Count());            Console.WriteLine(seq.Count());//5            Console.WriteLine(seq.ToString());//v,w,x,y,z            Console.WriteLine(seq[1]);//w            Console.WriteLine(seq[0]);//v            Console.WriteLine(seq[4]);//z            Console.WriteLine(seq.IndexOf("z"));//4            Console.WriteLine(seq.RemoveAt(2));//x            Console.WriteLine(seq.ToString());//v,w,y,z            seq.InsertBefore("x", 2);                       Console.WriteLine(seq.ToString());//v,w,x,y,z            Console.WriteLine(seq.GetItemAt(2));//x            seq.Reverse();            Console.WriteLine(seq.ToString());//z,y,x,w,v            seq.InsertAfter("z_1", 0);            seq.InsertAfter("y_1", 2);            seq.InsertAfter("v_1", seq.Count()-1);            Console.WriteLine(seq.ToString());//z,z_1,y,y_1,x,w,v,v_1

順序表的優點:讀取元素時可直接定位,所以在某些操作(比如將順序表元素反轉合圍)中,不需要完全遍曆,迴圈次數(即時間複雜度)相對完全遍曆而言能減少一半。

順序表的優點:插入/刪除元素,因為要保持其順序性,所以後續元素需要移動,增加了時間開銷。

 

最後指出:.Net命名空間System.Collections.Generic中的List<T>就是一個內建的順序表.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.