链表+优先级
==================================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~9for?(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();}} }轉載于:https://blog.51cto.com/962410314/1546904
總結
- 上一篇: functools学习有感
- 下一篇: 图像处理之基础---仿射变换