【C#】 顺序表代码

范例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace ConsoleApplication11

{

    class SeqListProgram

    {

        public class SeqList<T> //: IList<T>

        {

            private int maxsize; //顺序表的容量


            public int Maxsize

            {

                get { return maxsize; }

            }

            private T[] data; //数组,用于存储顺序表中的数据元素

            private int last; //指示顺序表最后一个元素的位置下标


            public int Last

            {

                get { return last; }

                set { last = value; }

            }


            // 索引器

            public T this[int index]

            {

                get { return data[index]; }

                set { data[index] = value; }

            }


            public SeqList(int size)

            {

                data = new T[size];

                maxsize = size;

                last = -1;

            }

            // 顺序表的长度由于数组是 0 基数组,即数组的最小索引为 0,所以,顺序表的长度就是数

            // 组中最后一个元素的索引 last 加 1。

            public int GetLength()

            {

                return last + 1;

            }

            // 清空

            public void Clear()

            {

                last = -1;

            }


            public bool IsEmpty()

            {

                if (last < 0)

                {

                    return true;

                }

                return false;

            }

            // 判断顺序表是否已满

            public bool IsFull()

            {

                if (last == maxsize - 1)// 元素下标从0开始

                {

                    return true;

                }

                return false;

            }

            // 在顺序表末尾添加新元素

            public void Appled(T item)

            {

                if (!IsFull())

                {

                    data[++last] = item;

                }

                else

                {

                    Console.WriteLine(" 顺序表已满无法添加 ");

                }

            }

            //在顺序表的第i个数据元素的位置插入一个数据元素

            /*

                算法的时间复杂度分析:顺序表上的插入操作,时间主要消耗在数据的移动

            上,在第i个位置插入一个元素,从ai到an都要向后移动一个位置,共需要移动n-i+1

            个元素,而i的取值范围为 1≤i≤n+1,当i等于 1 时,需要移动的元素个数最多,

            为n个;当i为n+1 时,不需要移动元素。设在第i个位置做插入的概率为pi,则平

            均移动数据元素的次数为n/2。这说明:在顺序表上做插入操作平均需要移动表

            中一半的数据元素,所以,插入操作的时间复杂度为O(n)。

             */

            public void Insert(T item, int i)

            {

                if (i < 1 || i > last + 1)

                {

                    Console.WriteLine(" 位置非法 ");

                    return;

                }

                if (IsFull())

                {

                    Console.WriteLine(" 顺序表已满无法添加 ");

                    return;

                }

                if (i == last + 2)// 判断是不是末尾插入

                {

                    data[last + 1] = item;

                }

                else

                {

                    // i后面的元素往后移

                    for (int j = last; j >= i - 1; --j)

                    {

                        data[j + 1] = data[j];

                    }

                    //将新的数据元素插入到第i-1个位置上

                    data[i - 1] = item;

                }

                ++last;

            }

            //删除顺序表的第i个数据元素

            /*

             而i的取值范围为 1≤i≤n,当i等于 1 时,需要移动

            的元素个数最多,为n-1 个;当i为n时,不需要移动元素。设在第i个位置做删除

            的概率为pi,则平均移动数据元素的次数为(n-1)/2。这说明在顺序表上做删除操

            作平均需要移动表中一半的数据元素,所以,删除操作的时间复杂度为O(n)

             */

            public T Delete(int i)

            {

                T temp = default(T);// default 为泛型代码中的默认关键字

                if (IsEmpty())

                {

                    Console.WriteLine("顺序表为空");

                    return temp;

                }

                if (i < 1 || i > last + 1)

                {

                    Console.WriteLine(" 位置非法 ");

                    return temp;

                }

                if (i == last + 1)

                {

                    data[last--] = temp;

                }

                else

                {

                    temp = data[i - 1];

                    for (int j = i; j <= last; ++j)

                    {

                        data[j] = data[j - 1];

                    }

                }

                --last;

                return temp;

            }


            //获得顺序表的第i个数据元素

            public T GetElem(int i)

            {

                if (IsEmpty() || (i < 1) || (i > last + 1))

                {

                    Console.WriteLine("顺序表为空 or 位置非法!");

                    return default(T);

                }

                return data[i - 1];

            }

            //在顺序表中查找值为value的数据元素

            public int Locate(T value)

            {

                if (IsEmpty())

                {

                    Console.WriteLine("顺序表为空");

                    return -1;

                }

                for (int j = 0; j < last; ++j)

                {

                    if (data[j].Equals(value))

                    {

                        return j;

                    }

                }

                return -1;

            }

            /*

             算法的时间复杂度分析:顺序表中的按值查找的主要运算是比较,比较的次

            数与给定值在表中的位置和表长有关。当给定值与第一个数据元素相等时,比较

            次数为 1;而当给定值与最后一个元素相等时,比较次数为 n。所以,平均比较

            次数为(n+1)/2,时间复杂度为 O(n)

             */

            public void Reverse()

            {

                T temp = default(T);

                int len = GetLength();

                for (int i = 0; i <= len >> 1; ++i)

                {

                    temp = data[i];

                    data[i] = data[len - i];

                    data[len - i] = temp;

                }

            }

        }

        static void Main(string[] args)

        {

            SeqList<string> Sl = new SeqList<string>(3);

            Sl.Appled("str1");

            Sl.Appled("str2");

            Sl.Appled("str3");

         

            

            Console.WriteLine("{0}", Sl.GetLength());

            Console.WriteLine("{0}", Sl.GetElem(2));

           // string Del_item = Sl.Delete(3);

            Console.WriteLine("{0}", Sl[0]);

            Console.WriteLine("{0}", Sl.GetLength());

           SeqList<string> S2= new SeqList<string>(7);

          Console.WriteLine( S2.Maxsize);





            Console.ReadLine();





        }

    }

}


你可能感兴趣的:(C#,顺序表)