程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#模仿鏈表數據構造的實例解析

C#模仿鏈表數據構造的實例解析

編輯:C#入門知識

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;
      }
    }
  }
}

鏈表運用場景

運用場景:聚集(靜態數組)、貪吃蛇、地圖的輪回生成、山君機後果等等,鏈表可以贊助我們完成許多工作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved