c#链表

LinkedListNode<T>类可获得列表中的上一个元素和下一个元素。属性有List、Next、Previous、Value

List:返回与节点相关的LinkedList对象

Next和Previous:用于遍历列表,访问当前节点之后和之前的节点

Value:返回与节点相关的元素,类型为T

LinkedList<T>类可访问链表中的第一个或最后一个元素(First和Last),指定位置插入元素(AddAfter()、AddBefore()、AddFirst()、AddLast9()),链表中搜索元素(Find()和FindLast())

using System;
using System.Collections.Generic;
using System.Text;

namespace 链表
{
    public class Document
    {
        public string Title { get; }
        public string Content { get; }
        public byte Priority { get; }
        public Document (string title,string content,byte priority)
        {
            Title = title;
            Content = content;
            Priority = priority;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace 链表
{
    public class PriorityDocumentManager
    {
        private readonly LinkedList<Document> _documentlist;//包含所有文档
        private readonly List<LinkedListNode<Document>> _priorityNodes;//添加指定优先级的新文档的入口点
        public PriorityDocumentManager()
        {
            _documentlist = new LinkedList<Document>();
            _priorityNodes = new List<LinkedListNode<Document>>(10);
            for (int i = 0; i < 10; i++)
            {
                _priorityNodes.Add(new LinkedListNode<Document>(null));  //用null来初始化
            }
        }
        public void AddDocument(Document d)
        {
            if (d == null) throw new ArgumentNullException(nameof(d));
            AddDocumentToPriorityNode(d, d.Priority);
        }
        /// <summary>
        /// 文档先按优先级排序,再按添加文档的时间排序
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="priority"></param>
        private void AddDocumentToPriorityNode(Document doc, int priority)
        {
            //检查优先级是否在允许的优先级的范围内
            if (priority > 9 || priority < 0)
            {
                throw new ArgumentException("Priority must be between 0 and 9");
            }
            if (_priorityNodes[priority].Value == null)
            {
                --priority;
                //检查下一个较低的优先级
                if (priority >= 0)
                {
                    AddDocumentToPriorityNode(doc, priority);
                }
                else
                {
                    //现在不存在具有相同优先级或更低优先级的优先级节点
                    _documentlist.AddLast(doc);
                    _priorityNodes[doc.Priority] = _documentlist.Last;
                }
                return;
            }
            else//存在一个优先级节点
            {
                LinkedListNode<Document> prioNode = _priorityNodes[priority];
                if (priority == doc.Priority)//具有相同优先级的优先级节点存在
                {
                    _documentlist.AddAfter(prioNode, doc);
                    //将优先级节点设置为最后一个具有相同优先级的文档
                    _priorityNodes[doc.Priority] = prioNode.Next;
                }
                else//只存在优先级较低的优先级节点
                {
                    //获取优先级较低的第一个节点
                    LinkedListNode<Document> firstPrioNode = prioNode;
                    while (firstPrioNode .Previous !=null &&firstPrioNode.Previous.Value.Priority == prioNode.Value.Priority)
                    {
                        firstPrioNode = prioNode.Previous;
                        prioNode = firstPrioNode;
                    }
                    _documentlist.AddBefore(firstPrioNode, doc);
                    //将优先级节点设置为新值
                    _priorityNodes[doc.Priority] = firstPrioNode.Previous;
                }
            }
        }
        public void DisplayAllNodes()
        {
            foreach (Document doc in _documentlist)
            {
                Console.WriteLine($"priority:{doc.Priority },title {doc.Title }");
            }
        }
        //返回具有最高优先级的文档
        //它是链表中的第一个
        public Document GetDocument()
        {
            Document doc = _documentlist.First.Value;
            _documentlist.RemoveFirst();
            return doc;
        }
    }
}
using System;

namespace 链表
{
    class Program
    {
        static void Main(string[] args)
        {
            var pdm = new PriorityDocumentManager();
            pdm.AddDocument(new Document("one", "Sample", 1));
            pdm.AddDocument(new Document("two", "Sample", 3));
            pdm.AddDocument(new Document("three", "Sample", 4));
            pdm.AddDocument(new Document("four", "Sample", 3));
            pdm.AddDocument(new Document("five", "Sample", 2));
            //pdm.AddDocument(new Document("six", "Sample", 4));
            pdm.DisplayAllNodes();
        }
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值