C#實現順序表(線性表)完整執行個體_C#教程

來源:互聯網
上載者:User

本文執行個體講述了C#實現順序表(線性表)的方法。分享給大家供大家參考,具體如下:

基本思想是使用數組作為盛放元素的容器,數組一開始的大小要實現確定,並使用一個Pointer指向順序表中最後的元素。順序表中的元素是數組中元素的子集。順序表在記憶體中是連續的,優勢是尋找,弱勢是插入元素和刪除元素。

為避免裝箱拆箱,這裡使用泛型,代替object。使用object的例子可以參照本站這篇文章:http://www.jb51.net/article/87603.htm,這個連結中的例子實現的是隊列,並沒 有使用Pointer來標識 順序表中最後一個元素,而是動態調整數組的大小,這與本例明顯不同,動態調整數組大小開銷較大。使用object同樣可以完成順序表資料結構,但是頻繁裝箱拆箱造成較大的開銷,應使用泛型代替。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LinearList{  public interface IListDS<T>  {    int GetLength();    void Insert(T item, int i);    void Add(T item);    bool IsEmpty();    T GetElement(int i);    void Delete(int i);    void Clear();    int LocateElement(T item);    void Reverse();  }  //順序表類  class SequenceList<T>:IListDS<T>  {    private int intMaxSize;//最大容量事先確定,使用數組必須先確定容量    private T[] tItems;//使用數組盛放元素    private int intPointerLast;//始終指向最後一個元素的位置    public int MaxSize    {      get { return this.intMaxSize; }      set { this.intMaxSize = value; }    }    public T this[int i]//索引器方便返回    {      get { return this.tItems[i]; }    }    public int PointerLast    {      get { return this.intPointerLast; }    }    public SequenceList(int size)    {      this.intMaxSize = size;      this.tItems = new T[size];//在這裡初始化最合理      this.intPointerLast = -1;//初始值設為-1,此時數組中元素個數為0    }    public bool IsFull()//判斷是否超出容量    {      return this.intPointerLast+1 == this.intMaxSize;    }    #region IListDS<T> 成員    public int GetLength()    {      return this.intPointerLast + 1;//不能返回tItems的長度    }    public void Insert(T item, int i)//設i為第i個元素,從1開始。該函數表示在第i個元素後面插入item    {      if (i < 1 || i > this.intPointerLast + 1)      {        Console.WriteLine("The inserting location is wrong!");        return;      }      if (this.IsFull())      {        Console.WriteLine("This linear list is full! Can't insert any new items!");        return;      }      //如果可以添加      this.intPointerLast++;      for(int j=this.intPointerLast;j>=i+1;j--)      {        this.tItems[j] = this.tItems[j - 1];      }      this.tItems[i] = item;    }    public void Add(T item)    {      if (this.IsFull())//如果超出最大容量,則無法添加新元素      {        Console.WriteLine("This linear list is full! Can't add any new items!");      }      else      {        this.tItems[++this.intPointerLast] = item;//表長+1      }    }    public bool IsEmpty()    {      return this.intPointerLast == -1;    }    public T GetElement(int i)//設i最小從0開始    {      if(this.intPointerLast == -1)      {        Console.WriteLine("There are no elements in this linear list!");        return default(T);      }      if (i > this.intPointerLast||i<0)      {        Console.WriteLine("Exceed the capability!");        return default(T);      }      return this.tItems[i];    }    public void Delete(int i)//設i最小從0開始    {      if (this.intPointerLast == -1)      {        Console.WriteLine("There are no elements in this linear list!");        return;      }      if (i > this.intPointerLast || i < 0)      {        Console.WriteLine("Deleting location is wrong!");        return;      }      for (int j = i; j < this.intPointerLast; j++)      {        this.tItems[j] = this.tItems[j + 1];      }      this.intPointerLast--;//表長-1    }    public void Clear()    {      this.intPointerLast = -1;    }    public int LocateElement(T item)    {      if (this.intPointerLast == -1)      {        Console.WriteLine("There are no items in the list!");        return -1;      }      for (int i = 0; i <= this.intPointerLast; i++)      {        if (this.tItems[i].Equals(item))//若是自訂類型,則T類必須把Equals函數override        {          return i;        }      }      Console.WriteLine("Not found");      return -1;    }    public void Reverse()    {      if (this.intPointerLast == -1)      {        Console.WriteLine("There are no items in the list!");      }      else      {        int i = 0;        int j = this.GetLength() / 2;//結果為下界整數,正好用於迴圈        while (i < j)        {          T tmp = this.tItems[i];          this.tItems[i] = this.tItems[this.intPointerLast - i];          this.tItems[this.intPointerLast - i] = tmp;          i++;        }      }    }    #endregion  }  class Program  {    static void Main(string[] args)    {    }  }}

基於順序表的合并排序:

//基於順序表的合并排序static private SequenceList<int> Merge(SequenceList<int> s1,SequenceList<int> s2){  SequenceList<int> sList = new SequenceList<int>(20);  int i = 0;  int j = 0;  while(i<=s1.PointerLast&&j<=s2.PointerLast)  {    if (s1[i] < s2[j])    {      sList.Add(s1[i]);      i++;    }    else    {      sList.Add(s2[j]);      j++;    }  }  if (i > s1.PointerLast)  {    while (j <= s2.PointerLast)    {      sList.Add(s2[j]);      j++;    }    return sList;  }  else//即j>s2.PointerLast  {    while (i <= s1.PointerLast)    {      sList.Add(s1[i]);      i++;    }    return sList;  }}

更多關於C#相關內容感興趣的讀者可查看本站專題:《C#資料結構與演算法教程》、《C#遍曆演算法與技巧總結》、《C#程式設計之線程提示總結》、《C#操作Excel技巧總結》、《C#中XML檔案操作技巧匯總》、《C#常見控制項用法教程》、《WinForm控制項用法總結》、《C#數組操作技巧總結》及《C#物件導向程式設計入門教程》

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.