小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(C#)一個最簡單的鏈表類

 雪柳花明 2016-09-25
https://my.oschina.net/Tsybius2014/blog/277453

摘要: 一個最簡單的鏈表類

一、關(guān)于C#鏈表

C#鏈表可用類LinkedList來存放。本文中的類MyLinkedList只是實現(xiàn)了該類的最基本的功能。C#中沒有指針,但因為C#中類在賦值時傳遞的是地址,因此仍然可以利用這點制作一個鏈表。

二、結(jié)點類Node和鏈表類MyLinkedList代碼

/// <summary>
/// 鏈表結(jié)點
/// </summary>
class Node
{
    //結(jié)點數(shù)據(jù),前后結(jié)點
    public object Data;
    public Node PreviousNode;
    public Node NextNode;

    //構(gòu)造函數(shù)
    public Node(object data = null)
    {
        Data = data;
        PreviousNode = null;
        NextNode = null;
    }

    //輸出結(jié)點信息
    public override string ToString()
    {
        return Data.ToString();
    }
}

/// <summary>
/// 鏈表類
/// </summary>
class MyLinkedList
{
    //首結(jié)點、尾結(jié)點
    public Node First;
    public Node Last;

    //下一個結(jié)點、上一個結(jié)點
    public Node NextNode(Node n) { return n.NextNode; }
    public Node PreviousNode(Node n) { return n.PreviousNode; }

    //結(jié)點總數(shù)
    public int Count;

    //構(gòu)造函數(shù)
    public MyLinkedList()
    {
        this.First = null;
        this.Last = null;
        Count = 0;
    }

    /// <summary>
    /// 在結(jié)點node1之后增加結(jié)點node2,如果沒有該結(jié)點則在最后增加
    /// </summary>
    /// <param name="node1">結(jié)點1</param>
    /// <param name="node2">結(jié)點2</param>
    public void AddAfter(Node node1, Node node2)
    {
        //鏈表為空的情況
        if (First == null)
        {
            Console.WriteLine("Linked-list is null! Can not find node1(" + node1 + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node1.Data))
            {
                //如果node1是尾結(jié)點
                if (node1.NextNode == null)
                {
                    node2.NextNode = null;
                    node2.PreviousNode = node1;
                    node1.NextNode = node2;
                }
                else //如果node1不是尾結(jié)點
                {
                    node2.NextNode = node1.NextNode;
                    node2.PreviousNode = node1;
                    node2.NextNode.PreviousNode = node2;
                    node1.NextNode = node2; ;
                }

                Count++;
                Console.WriteLine("Node(" + node2 + "): Add Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node1 + "), Misson defeat");
    }

    /// <summary>
    /// 在鏈表尾部增加結(jié)點
    /// </summary>
    public void AddLast(Node node)
    {
        //鏈表為空的情況
        if (this.First == null) 
        {
            node.NextNode = null;
            node.PreviousNode = null;

            this.First = node;
            this.Last = node;
        }
        else //鏈表不為空的情況
        {
            Node temp = First;
            while(temp.NextNode != null)
            {
                temp = temp.NextNode;
            }

            temp.NextNode = node;
            node.PreviousNode = temp;

            Last = node;
        }

        Count++;
        Console.WriteLine("Node(" + node + "): Add Complete!");
    }

    /// <summary>
    /// 刪除指定結(jié)點
    /// </summary>
    /// <param name="node">被刪除結(jié)點</param>
    public void Delete(Node node)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            //如果數(shù)據(jù)部分匹配,則刪去該結(jié)點
            if (temp.Data.Equals(node.Data))
            {
                //temp是尾結(jié)點
                if (temp.NextNode == null)
                {
                    temp.PreviousNode.NextNode = null;
                    temp = null;
                }
                else //temp不是尾結(jié)點 
                {
                    temp.PreviousNode.NextNode = temp.NextNode;
                    temp.NextNode.PreviousNode = temp.PreviousNode;
                    temp = null;
                }

                Count--;
                Console.WriteLine("Node(" + node + "): Delete Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node + "), Misson defeat");
    }

    /// <summary>
    /// 修改結(jié)點值
    /// </summary>
    /// <param name="node">被修改結(jié)點</param>
    /// <param name="value">結(jié)點值</param>
    public void Modify(Node node, object value)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node.Data))
            {
                Console.WriteLine("Node: " + temp.Data + " → " + value.ToString());
                temp.Data = value;
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);
    }

    /// <summary>
    /// 打印鏈表
    /// </summary>
    public void Print()
    {
        if (First == null)
        {
            Console.WriteLine("No nodes in this linked-list.");
            return;
        }
        else
        {
            Console.WriteLine("Print the linked-list...");
            Node temp = First;
            do
            {
                Console.WriteLine(temp.ToString());
                temp = temp.NextNode;
            }
            while (temp != null);
            Console.WriteLine("Mission Complete!");
        }
    }
}

三、Main函數(shù)的調(diào)用示例

static void Main(string[] args)
{

    MyLinkedList ll = new MyLinkedList();

    //添加三個結(jié)點 1 2(在1后) 3(在2后)
    Node n1 = new Node("node1");            
    Node n2 = new Node("node2");
    Node n3 = new Node("node3");
            
    ll.AddLast(n1);
    ll.AddLast(n2);
    ll.AddLast(n3);

    //添加三個結(jié)點 1.5(在1后) 2.5(在2后) 3.5(在3后)
    Node n1dot5 = new Node("node1dot5");
    Node n2dot5 = new Node("node2dot5");
    Node n3dot5 = new Node("node3dot5");

    ll.AddAfter(n1, n1dot5);
    ll.AddAfter(n2, n2dot5);
    ll.AddAfter(n3, n3dot5);

    Console.WriteLine("========================");

    //打印鏈表
    ll.Print();

    Console.WriteLine("========================");

    //刪除結(jié)點 2 和 3,將結(jié)點 2.5 的值改為 "ThisNodeIsModified!"
    ll.Delete(n2);
    ll.Delete(n3);
    ll.Modify(n2dot5, "ThisNodeIsModified!");

    Console.WriteLine("========================");

    //打印鏈表
    ll.Print();

    Console.ReadLine();
}

四、運行結(jié)果

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多