xmfdsh我近來心情實在不好,只因為這兩天課比較少,然后一下子時間太多,不知道干什么,心情郁悶。。。。。。這是要鬧哪樣?這都讓我一個郁悶了一個晚上。閑來無聊,回顧下之前學的C#數據結構,數據結構的重要性無論是對於哪門語言都是很必要也很重要的,課程中老師教的C語言,然后我自己自學的C#,再自學了C#的數據結構,對比了下,發現C,C++這些有着指針,比較低級點的語言,寫起數據結構更加能考驗一個人的思維,C#作為一門高級語言,也是有着自己一套數據結構的,這些更深層次的對比等我都學了比較精通再來慢慢對比吧。
附上整個項目的源碼:http://files.cnblogs.com/xmfdsh/%E9%A1%BA%E5%BA%8F%E8%A1%A8.rar
今天的主題:順序表
在計算機內,保存線性表最簡單的方式,就是把表中的元素一個接着一個地放進順序的存儲單元,這就是線性表的順序存儲。線性表的順序存儲是指在內存中用一塊地址連續的空間一次存放線性表的數據元素,用這種方式存儲的線性表叫順序表。
由於只考慮到線性表的基本操作,所以以C#接口的形式表示線性表,接口中的方法成員表示基本操作,為了使線性表對任何數據類型都使用,數據元素的類型使用泛型的類型參數
線性表的接口如下表述:
public interface IListDS<T> { //求長度 int GetLength(); //清空 void Clear(); //判斷線性表是否為空 bool IsEmpty(); //判斷線性表是否為滿 bool IsFull(); //附加操作 void Append(T item); //插入 void Insert(T item, int i); //刪除 T Delete(int i); //取表元 T GetElem(int i); //按值查找 int Locate(T value); }
接下來就是定義一個類來實現這些接口,首先今天講的既然是順序表的話,那么我定義一個ListDS類,來實現這些接口,在那之前先在順序表中定義幾個參數,和實現這些參數的屬性:
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 ListDS(int size) { data = new T[size]; maxsize = size; last = -1; }
接下來便是實現這些接口了,方法很簡單,既然是數組的話,沒有指針什么的,就沒有什么難度,像之前學C一樣很直接的方式:
//---------------------------------------一下實現接口方法------------------------------------ //獲取長度 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("順序表已經滿"); return; } data[++last] = item; } //在順序表第i位置插入一個數據元素 public void Insert(T item, int i) { if(IsFull()) { Console.WriteLine("順序表已經滿"); return; } if(i<1||i>last+2) { Console.WriteLine("插入位置錯誤,不允許"); return; } if(i==last+2) { data[++last] = item; } else { for(int j=last;j>=i-1;j--) { data[j + 1] = data[j]; } data[i - 1] = item; last++; } } //刪除 public T Delete(int i) { T temp = default(T); if(IsEmpty()) { Console.WriteLine("集合為空"); return temp; } if(i<1||i>last+2) { Console.WriteLine("刪除位置錯誤,不允許"); return temp; } if(i==last+1) { temp = data[last--]; } else { temp = data[i - 1]; for(int j=i;j<=last;j++) { data[j-1] = data[j]; } --last; } return temp; } //根據id獲取數據元 public T GetElem(int i) { if(IsEmpty()||(i<1)||(i>last+1)) { Console.WriteLine("獲取數據的位置錯誤,不允許"); return default(T); } return data[i - 1]; } //根據數據查找 對應的位置 public int Locate(T value) { if(IsEmpty()) { Console.WriteLine("順序表為空"); return -1; } int i = 0; for(i=0;i<=last;i++) { if (value.Equals(data[i])) break; } if(i>last) { return -1; } return i; }
接下來整個數據結構就基本實現了,那么那些實現的菜單和測試的方法我就不寫了,再做幾道經典的題目吧,首先,就是順序表倒置,很簡單,其實就是泛型的T不一樣:
//----------------------------------------順序表擴展方法---------------------------------------------- /// <summary> /// 順序表倒置 /// </summary> /// <param name="L"></param> public void ReverListDS() { T temp = default(T); int len = GetLength(); for(int i=0;i<=len/2;i++) { temp = data[i]; data[i] = data[len - i]; data[len - 1] = temp; } }
第二題:按升序 合並兩個表(只限int類型),這里還是可以不一定要限制int類型的,有興趣的可以去嘗試一下,我就拿之前C的最簡單的int類型來操作
;
/// <summary> /// 按升序 合並兩個表(只限int類型) /// </summary> /// <param name="La"></param> /// <param name="Lb"></param> /// <returns></returns> public ListDS<int> Merge(ListDS<int> La,ListDS<int> Lb) { ListDS<int> Lc = new ListDS<int>(La.maxsize + Lb.maxsize); int i = 0; int j = 0; int k = 0; //兩個表中都有數據元素 while((i<=(La.GetLength()-1))&&(j<=(Lb.GetLength()-1))) { if(La[i]<Lb[j]) { Lc.Append(La[i++]); } else { Lc.Append(Lb[j++]); } } //a表中剩余的元素 while(i<=(La.GetLength()-1)) { Lc.Append(La[i++]); } //b表中剩余的元素 while(j<(Lb.GetLength()-1)) { Lc.Append(Lb[j++]); } return Lc; }
第三題:構造順序表Lb,只包含La中所有值不相同元素(以int類型為例)
/// <summary> /// 構造順序表Lb,只包含La中所有值不相同元素(以int類型為例) /// </summary> /// <param name="La"></param> /// <returns></returns> public ListDS<int> Purge(ListDS<int> La) { ListDS<int> Lb = new ListDS<int>(La.Maxsize); Lb.Append(La[0]); for(int i=0;i<La.GetLength();i++) { int j = 0; for(j=0;j<Lb.GetLength()-1;j++) { if(La[i].CompareTo(Lb[j])==0) { break; } } if(j>=Lb.GetLength()-1) { Lb.Append(La[i]); } } return Lb; }
好,順序表就這樣完成了,一下子心情大好,在碼這些數據結構的時候,xmfdsh一直在思考,不僅僅思考這個數據結構,更多的是為什么今天會如此焦慮,如此慌亂,明明那么多東西要做,那么多東西要學,當時間來的時候,為什么一下子迷茫到不知道學點什么,一個晚上,xmfdsh終於得出了自己的結論,盡管asp.net 的MVC已經算入門,而且很喜歡,但是asp.net的基礎還不是很牢固,更應該去好好學習(昨晚一位師兄突然問我asp.net學的怎樣,想給我項目的樣子),自己都覺得學無止境啊,另外,發現心情不好的時候碼一下代碼,竟然能有這等效果,該不會我已經屌絲到這種地步了吧,哈哈哈哈,以后每個星期學一種數據結構或者一種算法,就這么決定了。
