C# 顺序表 SequenceList

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SequenceList
{
    public interface IListDS<T>
    {
        int GetLength();
        void Clear();
        bool IsEmpty();
        void Append(T item);
        void Insert(T item, int i);
        T Delete(int i);
        T GetElem(int i);
        int Locate(T value);
    }

    public class SeqList<T> : IListDS<T>
    {
        private int maxsize;
        private T[] data;
        private int last;

        public T this[int index]
        {
            get
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }

        public int Last
        {
            get
            {
                return last;
            }
        }

        public int Maxsize
        {
            get
            {
                return maxsize;
            }
            set
            {
                maxsize = value;
            }
        }

        public SeqList(int size)
        {
            data = new T[size];
            maxsize = size;
            last = -1;
        }

        public int GetLength()
        {

            return last + 1;
        }

        public void Clear()
        {
            last = -1;
        }

        public bool IsEmpty()
        {
            if (last == -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool IsFull()
        {
            if (last == maxsize - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public void Append(T item)
        {
            if (IsFull())
            {
                Console.WriteLine("List is full.");
                return;
            }
            data[++last] = item;
        }

        public void Insert(T item, int i)
        {
            if (IsFull())
            {
                Console.WriteLine("List is full.");
                return;
            }

            if (i < 1 || i > last + 2)
            {
                Console.WriteLine("Location is error.");
                return;
            }

            if (i == last + 2)
            {
                data[last + 1] = item;
            }
            else
            {
                for (int j = last; j > i; j++)
                {
                    data[j + 1] = data[j];
                }
                data[i - 1] = item;
            }
            last++;
        }

        public T Delete(int i)
        {
            T tmp = default(T);
            if (IsEmpty())
            {
                Console.WriteLine("List is empty.");
                return tmp;
            }

            if (i < 1 || i > last + 1)
            {
                Console.WriteLine("Position is error");
                return tmp;
            }

            if (i == last + 1)
            {
                tmp = data[last--];
            }
            else
            {
                tmp = data[i - 1];
                for (int j = i -1; j < last +1; j++)
                {
                    data[j] = data[j + 1];
                }
            }
            last--;
            return tmp;
        }

        public T GetElem(int i)
        {
            if (IsEmpty() || i < 1 || i >last +1)
            {
                Console.WriteLine("List is empty, or position is error.");
                return default(T);
            }
            return data[i - 1];
        }

        public int Locate(T value)
        {
            if (IsEmpty())
            {
                Console.WriteLine("List is empty");
                return -1;
            }

            int i = 0;
            for (i = 0; i < last+1; i++)
            {
                if (data[i].Equals(value))
                {
                    break;
                }
            }
            if (i>last)
            {
                return -1;
            }
            else
            {
                return i;
            }
        }

        public void PopOrder(SeqList<int> L)
        {
            for (int i = L.GetLength() - 1; i >0; i--)
            {
                for (int j = 0; j < i; j++)
                {
                    if (L[i]<L[j])
                    {
                        int temp = L[i];
                        L[i] = L[j];
                        L[j] = temp;
                    }
                }
            }
        }

        public SeqList<int> ReverseSeqList(SeqList<int> L)
        {
            if (L == null || L.GetLength() < 2)
            {
                return L;
            }

            SeqList<int> result = L;
            int tmp = 0;
            int len = result.GetLength();
            for (int i = 0; i < len/2; i++)
            {
                tmp = result[i];
                result[i] = result[len - i - 1];
                result[len - i - 1] = tmp;
            }
            return result;
        }

        public SeqList<int> Merge(SeqList<int> La, SeqList<int> Lb)
        {
            SeqList<int> Lc = new SeqList<int>(La.GetLength() + Lb.GetLength());
            int a = 0, b = 0;
            while (a<La.GetLength() && b<Lb.GetLength())
            {
                if (La[a]<Lb[b])
                {
                    Lc.Append(La[a++]);
                }
                else
                {
                    Lc.Append(Lb[b++]);
                }
            }
            while (a<La.GetLength())
            {
                Lc.Append(La[a++]);
            }
            while (b<Lb.GetLength())
            {
                Lc.Append(Lb[b++]);
            }
            return Lc;
        }

        public SeqList<int> Purge(SeqList<int> La)
        {
            SeqList<int> Lb = new SeqList<int>(La.GetLength());
            Lb.Append(La[0]);

            for (int i = 1; i < La.GetLength(); i++)
            {
                int j = 0;
                for (; j < Lb.GetLength(); j++)
                {
                    if (Lb[j]==La[i])
                    {
                        break;
                    }
                }
                if (j > Lb.GetLength() - 1)
                {
                    Lb.Append(La[i]);
                }
            }
            return Lb;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            SeqList<int> intList = new SeqList<int>(100);
            intList.Append(2);
            intList.Append(5);
            intList.Append(20);
            intList.Append(6);
            intList.Append(9);
            intList.Append(13);
            intList.Append(45);
            intList.Append(68);
            intList.Append(91);
            intList.Append(34);
            intList.Append(71);
            intList.Append(85);

            SeqList<int> intList2 = new SeqList<int>(100);
            intList2.Append(4);
            intList2.Append(6);
            intList2.Append(75);
            intList2.Append(86);
            intList2.Append(37);
            intList2.Append(48);
            intList2.Append(63);
            intList2.Append(92);
            intList2.Append(8);
            intList2.Append(2);

            for (int i = 0; i < intList.GetLength(); i++)
            {
                Console.Write(intList[i] + " ");
            }
            Console.WriteLine();

            for (int i = 0; i < intList2.GetLength(); i++)
            {
                Console.Write(intList2[i] + " ");
            }
            Console.WriteLine();

            intList.PopOrder(intList);
            intList2.PopOrder(intList2);

                        for (int i = 0; i < intList.GetLength(); i++)
            {
                Console.Write(intList[i] + " ");
            }
            Console.WriteLine();

            for (int i = 0; i < intList2.GetLength(); i++)
            {
                Console.Write(intList2[i] + " ");
            }
            Console.WriteLine();

            SeqList<int> intList3 = new SeqList<int>(100);
            intList3 = intList3.Merge(intList, intList2);
            for (int i = 0; i < intList3.GetLength(); i++)
            {
                Console.Write(intList3[i] + " ");
            }
            Console.WriteLine();

            SeqList<int> intList4 = new SeqList<int>(100);
            intList4 = intList4.Purge(intList3);
            for (int i = 0; i < intList4.GetLength(); i++)
            {
                Console.Write(intList4[i] + " ");
            }
            Console.WriteLine();
        }
    }
}


原文地址:https://www.cnblogs.com/Ligeance/p/2196319.html