链表+优先级

==================================Document.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
    public class Document//文档类
    {
        public string Title { get; private set; }//标题
        public string Content { get; private set; }//内容
        public byte Priority { get; private set; }//优先级
        public Document(string title, string content, byte priority)
        {
            this.Title = title;
            this.Content = content;
            this.Priority = priority;
        }

        public override string ToString()
        {
            return string.Format("标题:{0},内容:{1},优先级:{2}", this.Title, this.Content, this.Priority);
        }
    }
}

==================================PriorityDocumentManage.cs【核心】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace ConsoleApplication4
{
    public class PriorityDocumentManage:IEnumerable
    {
        //链表
        private readonly LinkedList<Document> documentList;
        //优先级节点
        private readonly List<LinkedListNode<Document>> priorityNodes;
        public PriorityDocumentManage()
        {
            //初始化链表
            documentList = new LinkedList<Document>();
            //初始化优先级节点
            priorityNodes = new List<LinkedListNode<Document>>();
            //设置优先级为0~9
            for (int i = 0; i < 10; i++)
            {
                priorityNodes.Add(new LinkedListNode<Document>(null));
            }
        }
        //向链表中添加文档
        public void AddDocument(Document d)
        {
            if (d == null) throw new ArgumentNullException("对象不能为空");
            AddDcoumentToPriorityNode(d, d.Priority);
        }
        private void AddDcoumentToPriorityNode(Document doc, int priority)
        {
            if (priority > 9 || priority < 0) throw new ArgumentException("优先级溢出");
            if (priorityNodes[priority].Value == null)//该优先级节点的值为空,说明链表中还没有存在该优先级的元素
            {
                --priority;
                if (priority >= 0)//继续往更低的优先级下面找
                {
                    AddDcoumentToPriorityNode(doc, priority);
                }
                else//进入此方法,说明是第一个插入链表的元素
                {
                    documentList.AddLast(doc);//将元素插入到链表的最后位置
                    priorityNodes[doc.Priority] = documentList.Last;//把传入的元素赋值给对应优先级的优先级节点
                }
            }
            else
            {
                LinkedListNode<Document> currentDoc = priorityNodes[priority];
                if (doc.Priority == priority)//优先级节点存对应的优先级已存在元素【优先级节点只存对应优先级最后添加的元素】
                {
                    documentList.AddAfter(currentDoc, doc);//将元素插入到对应元素的后面
                    priorityNodes[doc.Priority] = currentDoc.Next;//将对应的优先级节点赋值为对应优先级最后添加的元素
                }
                else//说明不是传入元素对应的优先级节点
                {
                    
                    while (currentDoc.Previous != null && currentDoc.Previous.Value.Priority == priority)//找到该优先级最前面的元素
                    {
                        currentDoc = currentDoc.Previous;
                    }
                    documentList.AddBefore(currentDoc, doc);//插入该元素的前面
                    priorityNodes[doc.Priority] = currentDoc.Previous;//将对应的优先级节点赋值为对应优先级最后添加的元素
                }
            }
        }

        public IEnumerator GetEnumerator()
        {
            return documentList.GetEnumerator();
        }
        //找到第一个元素,并删除该元素
        public Document GetDocument()
        {
            Document d = documentList.First.Value;
            documentList.RemoveFirst();
            return d;
        }
    }
}

==================================主程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            PriorityDocumentManage pdm = new PriorityDocumentManage();
            pdm.AddDocument(new Document("a", "a", 5));
            pdm.AddDocument(new Document("b", "b", 5));
            pdm.AddDocument(new Document("c", "c", 8));
            pdm.AddDocument(new Document("d", "d", 5));
            pdm.AddDocument(new Document("e", "e", 6));
            foreach (var item in pdm)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}

时间: 2024-10-31 04:11:47

链表+优先级的相关文章

# IT明星不是梦 #图解kubernetes调度器SchedulingQueue核心源码实现

chedulingQueue是kubernetes scheduler中负责进行等待调度pod存储的对,Scheduler通过SchedulingQueue来获取当前系统中等待调度的Pod,本文主要讨论SchedulingQueue的设计与实现的各种实现, 了解探究其内部实现与底层源码,本系列代码基于kubernets1.1.6分析而来 SchedulingQueue设计 队列与优先级 队列与场景 类型 描述 通常实现 队列 普通队列是一个FIFO的数据结构,根据元素入队的次序依次出队 数组或者

有序链表实现的优先级队列

package day1_29; public class Link { public long dDate; public Link next; public Link(long dDate){ this.dDate = dDate; } //打印链结点的方法 public void displayLink(){ System.out.println("["+dDate+"]"); } } =====================================

关于链表的一个小程序

关于链表的一个小程序: /**************************链表*****************************//* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/ #include<stdio.h>#in

指针、链表的原理和各类操作相关心得以及学生信息管理系统

伴随着学期末的到来,C语言程序设计这门课也接近尾声.经过前两次的教学,我们对C语言也有了深刻的了解,学习的内容也不断的加深.这次我们就学习了C语言程序设计里应用最广泛,也是最难学习的知识--链表和指针的应用. 关于指针和链表这两个的应用和上次的管理系统有着直接的关系,没有添加链表和指针的管理系统无法做到精确的查找.数据存储方面也显得不方便.所以指针和链表的作用能够直接指向你所需要的数据地址,使程序更加完善.这次我就利用指针的应用制作了一个管理员工工资等信息的程序. §1 指向结构体变量的指针变量

循环单链表

//函数声明部分:#include"CirLinkList.h" #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct linknode { ElemType data; struct linknode *next; }node; void judgement_NULL(node * p); node 

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type

【C/C++学院】0802-链式栈/链表队列以及优先队列/封装链表库

链式栈 // stacklinknode.h #define datatype int struct stacknode { int num;//编号 datatype data;//数据 struct stacknode *pNext;//指针域 }; typedef struct stacknode StackNode;//简化 StackNode * init(StackNode * phead);//初始化 StackNode * push(StackNode * phead, int

Java for LintCode 链表插入排序

用插入排序对链表排序 解题思路: 最省时间的方法是使用优先级队列,但是无法通过,那就直接插入排序好了. public ListNode insertionSortList(ListNode head) { ListNode root = new ListNode(Integer.MIN_VALUE); while (head != null) { ListNode temp = root; while (temp.next != null && head.val >= temp.ne

动态单链表的传统存储方式和10种常见操作-C语言实现

顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. 一般链表的存储方法 一组物理位置任意的存储单元来存放线性表的数据元素,当然物理位置可以连续,也可以不连续,或者离散的分配到内存中的任意位置上都是可以的.故链表的逻辑顺序和物理顺序不一定一样. 因为,链表的逻辑关系和物理关系没有必然联系,那么表示数据元素之间的逻辑映象就要使用指针,每一个存储数据元素