欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# 双向循环数据链表实现

程序员文章站 2022-05-31 16:14:50
...

    最近在做一个大项目。哈哈。。。就是开发一个让用户*搭建场景的软件。最近一周都在解决画面的问题。今天已经都给解决了。我们在实现画面的过程中,需要获取到闭合区间所有顶点以及沿着某一方向的顺序存储。这时候,选择双向循环链式数据表存储数据再好不过了。下面就是链式数据表的代码:

    首先我们创建每一个节点:

//环形双向链表
public class Node<T>
{
    public T Data { get; set; }//每个节点的数据

    public Node<T> NextNode { get; set; }//下一节点

    public Node<T> PreNode { get; set; }//上一节点

    public Node(T val, Node<T> pre, Node<T> next)
    {
        Data = val;
        pre = NextNode;
        next = NextNode;
    }

    public Node(T data)
    {
        Data = data;
    }
}

    然后我们就开始创建一个属于我们的链式数据表。

//环形双向链表
public class CircleLink<T> 
{
    private Node<T> head;

    public Node<T> Head
    {
        get
        {
            return head;
        }

        set
        {
            head = value;
        }
    }

    public CircleLink()
    {
        head = null;
    }

    //获取链表大小
    public int Count()
    {
        Node<T> p = head;
        if (head.PreNode == null)
            Debug.LogError("不是环形链表");
        int count = 0;
        while(p.NextNode!=head)
        {
            count++;
            p = p.NextNode;
        }
        return count + 1;
    }

    //获取索引处值
    public T GetElem(int i)
    {
        Node<T> p = head;
        int k = 0;
        if (i > Count() || i < 0)
        { Debug.LogError("数组越界"); }

        while(k<i)
        {
            k++;
            p = p.NextNode;
        }
        return p.Data;
    }


    //根据数据获取链表结点
    public Node<T> GetNode(T data)
    {
        if(head==null)
        {
            Debug.LogError("sb");
            return null;
        }
        Node<T> p = head;
        while(p.Data.Equals(data)==false)
        {
            if (p.NextNode == head)
            {
                Debug.LogError("没有此节点");
                return null;
            }
               
            p = p.NextNode;
        }
        return p;
    }

    public Node<T> GetNode(int index)
    {
        if (head == null)
        {
            Debug.LogError("sb");
            return null;
        }
        Node<T> p = head;
        int k = 0;

        if (index > Count() || index < 0)
        { Debug.LogError("数组越界"); }
        while (k < index)
        {
            k++;
            p = p.NextNode;
        }
        return p;
    }

    //移除指定位置索引
    public void RemoveElem(int i)
    {
        Node<T> p = GetNode(i);

        RemoveNode(p);
    }
    //移除指定位置索引
    public void RemoveNode(Node<T> p)
    {
        p.PreNode.NextNode = p.NextNode;
        p.NextNode.PreNode = p.PreNode;
        if (p==head)
        {
            head = p.NextNode;
        }
    }

    //增加一个新的元素
    public void AddElem(T data)
    {
        if(head==null)
        {
            head = new Node<T>(data);
            head.NextNode = head;
            head.PreNode = head;
            return;
        }
        Node<T> p = head;
        while(p.NextNode!=head)
        {
            p = p.NextNode;
        }
        Node<T> newNode = new Node<T>(data);

        p.NextNode = newNode;
        newNode.PreNode = p;
        newNode.NextNode = head;
        head.PreNode = newNode;
    }

    //删除链表内所有
    public void Clear()
    {
        head = null;
    }
}

       如果我们需要每个节点存储多个数据,我们就可以自己声明一个结构体来当作节点数据的泛型类型。

       希望本博客对你有帮助!