国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#數據結構之順序表(SeqList)實例詳解

2020-01-24 01:21:38
字體:
來源:轉載
供稿:網友

本文實例講述了C#數據結構之順序表(SeqList)實現方法。分享給大家供大家參考,具體如下:

線性結構(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());//5Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq[1]);//wConsole.WriteLine(seq[0]);//vConsole.WriteLine(seq[4]);//zConsole.WriteLine(seq.IndexOf("z"));//4Console.WriteLine(seq.RemoveAt(2));//xConsole.WriteLine(seq.ToString());//v,w,y,zseq.InsertBefore("x", 2);      Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq.GetItemAt(2));//xseq.Reverse();Console.WriteLine(seq.ToString());//z,y,x,w,vseq.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>就是一個內置的順序表.

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宿州市| 施甸县| 唐河县| 醴陵市| 兴文县| 青冈县| 襄城县| 泸西县| 视频| 商丘市| 台湾省| 博野县| 新竹市| 贞丰县| 汕尾市| 綦江县| 齐河县| 德惠市| 高雄县| 始兴县| 宣化县| 南阳市| 永昌县| 泸西县| 穆棱市| 雷波县| 泾源县| 辽中县| 繁昌县| 庆元县| 确山县| 潮安县| 淮南市| 北辰区| 屏山县| 筠连县| 永康市| 大渡口区| 华蓥市| 白水县| 日喀则市|