1. 程式人生 > >[資料結構]C#順序表的實現

[資料結構]C#順序表的實現

在資料結構的學習當中,想必C++可能是大家接觸最多的入門語言了

但是C#的資料結構卻很少看到,今天我寫了一個C#順序表的順序儲存結構

順序表是在計算機記憶體中以陣列的形式儲存的線性表,線性表的順序儲存是指用一組地址連續的儲存單元依次儲存線性表中的各個元素、使得線性表中在邏輯結構上相鄰的資料元素儲存在相鄰的物理儲存單元中,即通過資料元素物理儲存的相鄰關係來反映資料元素之間邏輯上的相鄰關係,採用順序儲存結構的線性表通常稱為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。 

將表中元素一個接一個的存入一組連續的儲存單元中,這種儲存結構是順序結構。 採用順序儲存結構的線性表簡稱為“ 順序表”。順序表的儲存特點是:只要確定了起始位置,表中任一元素的地址都通過下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n 其中,L是元素佔用儲存單元的長度。 下面是我們的程式碼!

首先是建立一個順序表的介面實現裡面的方法:插入,刪除,查詢等等。

    public interface IListDs<T> {
        void Clear();//清空
        int GetLength();//獲得長度
        bool IsEmpty();//是否為空
        void Add(T item);//新增功能
        void Insert(T item, int index);//插入功能
        T Delete(int index);//刪除功能
        T GetEle(int index);//獲得操作物件提供給索引器
        T this[int index] { get; }//索引器
        int Locate(T value);//當前位置
    }

接著建立一個類實現介面

class SeqList<T> : IListDs<T>//實現介面方法
    {
        /// <summary>
        /// 順序表實現方式
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>

        private T[] data;//獲得一個數組

        private int count = 0;

        public SeqList(int size)//size就是最大容量(建構函式)
        {
            data = new T[size];//獲得T型別的陣列長度
            count = 0;
        }
        public SeqList() : this(10) { }//呼叫這個構造方法,傳入一個整型引數值為10.

        public T this[int index]
        {
            get
            {
                return GetEle(index);//獲得當前索引器的長度
            }
        }

        public void Add(T item)
        {
            if (count.Equals(data.Length))//判斷當前的資料長度是多少,如果給定的數值的大於建構函式的值則返回錯誤
            {
                Console.WriteLine("當前順序表已充滿,不允許再存");
            }
            else
            {//如果呼叫該方法,則item的值會賦予data但是必須要有下標存放,所以為data[count],count+=1是為了不讓資料被覆蓋,而是能夠一直新增資料
                data[count] = item;
                count += 1;
            }
        }

        public void Clear()
        {
            count = 0;//清空順序表的元素
        }

        public T Delete(int index)
        {
            T temp = data[index];//
            for (int i = index+1; i <count; i++)
            {
                data[i - 1] = data[i];//把資料向前移動                
            }
            count--;
            return temp;
        }

        public T GetEle(int index)
        {
            //傳進的引數為當前類的可迭代物件的下標
            if (index >= 0 && index <= count - 1)
            {
                return data[index];
            }
            else
            {
                Console.WriteLine("索引不存在!");
                return default(T);
            }
        }
        /// <summary>
        /// 取得資料的個數
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return count;
        }

        public void Insert(T item, int index)
        {
            for (int i = count; i >= index; i--)//從後向前插入,不然會地址改變後替換掉後一元素值
            {
                data[i + 1] = data[i];
            }
            data[index] = item;
            count++;
        }

        public bool IsEmpty()
        {
            throw new NotImplementedException();
        }

        public int Locate(T value)//
        {
            for (int i = 0; i < count; i++)
            {
                if (data[i].Equals(value))
                {
                    return i;
                }
            }
            return -1;
        }
    }

最後在控制檯程式Program中呼叫

 class Program
    {
        static void Main(string[] args)
        {
            
            //C#資料結構的操作例項
            SeqList<string> seqList = new SeqList<string>();
            //插入操作
            seqList.Add("123");
            seqList.Add("456");
            seqList.Add("789");            
            //獲得索引物件
            Console.WriteLine(seqList.GetEle(0));
            Console.WriteLine(seqList[0]);
            seqList.Insert("777", 1);
            for (int i = 0; i < seqList.GetLength(); i++)
            {
                Console.WriteLine(seqList[i] + " ");
            }
            Console.WriteLine();
            seqList.Delete(0);
            for (int i = 0; i < seqList.GetLength(); i++)
            {
                Console.WriteLine(seqList[i] + " ");
            }
            Console.WriteLine();
            Console.WriteLine(seqList.Locate("777"));
            seqList.Clear();
            Console.WriteLine(seqList.GetLength());
            Console.Read();
        }
    }

上述操作實現了順序表在C#中的操作,用到了索引器和建構函式賦值

對於新手學習C#和資料結構是非常有幫助的。希望大家