C#模仿鏈表數據構造的實例解析。本站提示廣大學習愛好者:(C#模仿鏈表數據構造的實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#模仿鏈表數據構造的實例解析正文
寫在後面
模塊化編程是年夜多半初學者必經之路,然後能夠你走向了卻構化編程,鏈表是一種典范構造形式,它的湧現戰勝了數組必需事後曉得年夜小的缺點,聽不懂?你只須要記住,鏈表構造異常牛叉便可以了,進修這類構造對我們的邏輯思想有很年夜晉升。
甚麼是鏈表構造呢?
鏈表是一種物理存儲單位上非持續、非次序的存儲構造。好比A->B->C,這類構造,我們可以懂得為A銜接著B,B銜接C,像這類構造我們就叫做鏈表構造。對了,火車的車箱,其實就是鏈表的構造的最好解釋
為何要有鏈表構造呢?
學過盤算機的都曉得數組(Array),數組經常使用切好用,但也存在成績。起首,數組必需須要曉得空間年夜小(int[] age = new int[100], 必需聲明長度),其次,關於元素之間拔出、刪除操作效力很低(若何在數組中央拔出一個元素?)。
鏈表的湧現,完善的處理了這些成績。
若何完成鏈表
起首我們須要聲明一種構造
//鏈表構造: 結構節點 - 銜接節點 //Template class Node { public int num; //指向下一個元素 public Node next; } //鏈表構造: 結構節點 - 銜接節點 //Template class Node { public int num; //指向下一個元素 public Node next; }
我們可以把下面的這類構造看作是一個禮物盒,可以寄存整形數值。
然後我們創立一個MyList師長教師,這位師長教師就應用Node去寄存整形物品,並且應用了鏈表構造哦!
class MyList { public Node currentNode; public Node point; public MyList() { currentNode = new Node(); } //寄存物品 public void Add(int value) { //第一次 if(point == null) { currentNode.num = value; point = currentNode; } else //2 3 4..... 次 { Node temp = new Node(); temp.num = value; point.next = temp; //更新指針 point = temp; } } } class MyList { public Node currentNode; public Node point; public MyList() { currentNode = new Node(); } //寄存物品 public void Add(int value) { //第一次 if(point == null) { currentNode.num = value; point = currentNode; } else //2 3 4..... 次 { Node temp = new Node(); temp.num = value; point.next = temp; //更新指針 point = temp; } } }
然後,我們可以在客戶端測試一下:
public static void Main (string[] args) { MyList<int> mList = new MyList<int>(); //添加元素 mList.Add(1); mList.Add(11); mList.Add(111); mList.Add(1111); while(mList.currentNode != null) { Console.WriteLine (mList.currentNode.num); mList.currentNode = mList.currentNode.next; } } public static void Main (string[] args) { MyList<int> mList = new MyList<int>(); //添加元素 mList.Add(1); mList.Add(11); mList.Add(111); mList.Add(1111); while(mList.currentNode != null) { Console.WriteLine (mList.currentNode.num); mList.currentNode = mList.currentNode.next; } }
我們本身界說的一個整形聚集就如許ok了。它有兩個長處:可以寄存隨意率性多個元素!便利元素的拔出和刪除。
雙向鏈表的界說和簡略操作:
雙向鏈表實際上是單鏈表的改良。當我們對單鏈表停止操作時,有時你要對某個結點的直接先驅停止操作時,又必需從表頭開端查找。這是由單鏈表結點的構造所限制的。由於單鏈表每一個結點只要一個存儲直接後繼結點地址的鏈域,那末能不克不及界說一個既有存儲直接後繼結點地址的鏈域,又有存儲直接先驅結點地址的鏈域的如許一個雙鏈域結點構造呢?這就是雙向鏈表。在雙向鏈表中,結點除含稀有據域外,還有兩個鏈域,一個存儲直接後繼結點地址,普通稱之為右鏈域;一個存儲直接先驅結點地址,普通稱之為左鏈域。
namespace DounlyLinkedlist { //界說雙向鏈表的結點 public class Node { public Object Element; public Node FLink; public Node BLink; public Node() { Element = null; FLink = null; BLink = null; } public Node(Object element) { Element = element; FLink = null; BLink = null; } } //鏈表操作的類 public class LinkedList { public Node Header; public LinkedList() { Header = new Node("Header"); Header.FLink = null; Header.BLink = null; } //查找結點 private Node Find(Object item) { Node Current = new Node(); Current = Header; while (Current.Element != item) { Current = Current.FLink; } return Current; } //拔出結點 public void InsertNode(Object item,Object postionItem) { Node Current = new Node(); Node NewItem = new Node(item); Current = Find(postionItem); if (Current != null) { NewItem.FLink = Current.FLink; NewItem.BLink = Current; Current.FLink = NewItem; } } //刪除結點 public void Remove(Object item) { Node P = Find(item); if (P.FLink != null) { P.BLink.FLink = P.FLink; P.FLink.BLink = P.BLink; P.BLink = null; P.FLink = null; } } //查找雙向鏈表最初一個結點元素 private Node FindLast() { Node Current = new Node(); Current = Header; while (!(Current.FLink == null)) { Current = Current.FLink; } return Current; } //逆向打印雙向鏈表 public void PrintReverse() { Node Current = new Node(); Current = FindLast(); while (!(Current.BLink == null)) { Console.WriteLine(Current.Element); Current = Current.BLink; } } //打印雙向鏈表 public void Print() { Node Current = new Node(); Current = Header; while (!(Current.FLink == null)) { Console.WriteLine(Current.FLink.Element); Current = Current.FLink; } } } }
鏈表運用場景
運用場景:聚集(靜態數組)、貪吃蛇、地圖的輪回生成、山君機後果等等,鏈表可以贊助我們完成許多工作。