C#資料結構-鏈表

來源:互聯網
上載者:User

理論基礎:

鏈表是用一組任意的儲存單元來儲存線性表中的資料元素。

如果結點的參考網域只儲存該結點直接後繼結點的儲存地址,則該鏈表叫單鏈表(Singly Linked List)。

單鏈表由頭引用H唯一確定。頭引用指向單鏈表的第一個結點,也就是把單鏈表第一個結點的地址放在H中。

C#實現:

1介面

引用線性表的介面IListDS<T>

2實現

首先,必須定義一個單鏈表的節點類
public class Node<T>
{
    private T data;        //資料域
    private Node<T> next;  //參考網域

    public Node(T val)
    {
        data = val;
        next = null;
    }

    public Node()
    {
        data = default(T);
        next = null;
    }

    public T Data
    {
        get { return data; }
        set { data = value; }
    }
    public Node<T> Next
    {
        get { return next; }
        set { next = value; }
    }
}
實現主體類

Append,Insert,InsertBack三個方法實質上都是插入操作,可以考慮用overload或者override來實現,有興趣的朋友試試。
public class LinkList<T> : IListDS<T>
{
    private Node<T> head;

    public Node<T> Head
    {

        get { return head; }
        set { head = value; }
    }
    public LinkList()
    {
        head = null;
    }

    /// <summary>
    /// 擷取長度
    /// </summary>
    /// <returns></returns>
    public int GetLength()
    {
        Node<T> p = head;
        int len = 0;
        while (p != null)
        {
            ++len;
            p = p.Next;
        }
        return len;
    }

    /// <summary>
    /// 清空操作
    /// </summary>
    public void Clear()
    {
        head = null;
    }

    /// <summary>
    /// 判斷線性表是否為空白
    /// </summary>
    /// <returns></returns>
    public bool IsEmpty()
    {
        if (head == null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /// <summary>
    /// 附加操作,線性表未滿,將值為item的新元素添加到末尾
    /// </summary>
    /// <param name="item"></param>
    public void Append(T item)
    {
        Node<T> newNode = new Node<T>(item);  //根據元素建立新的節點
        Node<T> node = new Node<T>();

        if (head == null)
        {
            head = newNode;
            return;
        }
        node = head;
        while (node.Next != null)
        {
            node = node.Next;
        }
        node.Next = newNode;
    }

    /// <summary>
    /// 尋找節點
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public Node<T> FindNode(int i)
    {
        if (IsEmpty())
        {
            Console.Write("List is empty");
            return null;
        }
        if (i < 1)
        {
            Console.Write("Index is error");
            return null;
        }
        Node<T> current = head;
        int j = 1;

        while (current.Next != null && j < i)
        {
            ++j;
            current = current.Next;
        }
        return current;
    }

    /// <summary>
    /// 插入操作,在第i個節點前面插入item
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void Insert(T item, int i)
    {
        Node<T> newNode = new Node<T>(item);
        Node<T> node = new Node<T>();
        Node<T> current = FindNode(i);
        if (current != null)
        {
            node = current;       //對目標節點備份
            newNode.Next = current;
            node.Next = newNode;
        }
    }

    /// <summary>
    /// 插入操作,在第i個節點後面插入item
    /// </summary>
    /// <param name="item"></param>
    /// <param name="i"></param>
    public void InsertBack(T item, int i)
    {
        Node<T> newNode = new Node<T>(item);
        Node<T> current = FindNode(i);
        if (current != null)
        {
            newNode.Next = current.Next;
            current.Next = newNode;
        }
    }

    /// <summary>
    /// 刪除操作
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T Delete(int i)
    {
        Node<T> current = FindNode(i);
        Node<T> node = new Node<T>();
        if (current != null)
        {
            node = current;   //對目標節點備份
            node.Next = current.Next;
            return current.Data;
        }
        else
        {
            Console.Write("the node is not exist!");
            return default(T);
        }
    }

    /// <summary>
    /// 去表元
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public T GetElem(int i)
    {
        Node<T> current = FindNode(i);

        if (current != null)
        {
            return current.Data;
        }
        else
        {
            Console.Write("the node is not exist!");
            return default(T);
        }
    }

    /// <summary>
    /// 按值尋找
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public int Locate(T value)
    {
        if (IsEmpty())
        {
            Console.WriteLine("List is Empty!");
            return -1;
        }
        Node<T> current = new Node<T>();
        current = head;
        int i = 1;
        while (current.Next != null && !current.Data.Equals(value))
        {
            current = current.Next;
            ++i;
        }
        return i;
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.