C#數據構造之次序表(SeqList)實例詳解。本站提示廣大學習愛好者:(C#數據構造之次序表(SeqList)實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#數據構造之次序表(SeqList)實例詳解正文
本文實例講述了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());//5 Console.WriteLine(seq.ToString());//v,w,x,y,z Console.WriteLine(seq[1]);//w Console.WriteLine(seq[0]);//v Console.WriteLine(seq[4]);//z Console.WriteLine(seq.IndexOf("z"));//4 Console.WriteLine(seq.RemoveAt(2));//x Console.WriteLine(seq.ToString());//v,w,y,z seq.InsertBefore("x", 2); Console.WriteLine(seq.ToString());//v,w,x,y,z Console.WriteLine(seq.GetItemAt(2));//x seq.Reverse(); Console.WriteLine(seq.ToString());//z,y,x,w,v seq.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#法式設計有所贊助。