C#中链表的用使用LinkedList



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 集合

{

    class 链表

    {

        public static void Main()

        { 

            //LinkedList<T>集合类没有非泛型类的版本,它是一个双向链表,它的元素指向元素的前一个与后一个元素

            //链表的优点是:如果要插入一个元素到链表的中间位置,会非常的快,

            //原因是,如果插入,只需要修改上一个元素的Next 与 下一个元素的Previous的引用则可。

            //ArrayList列表中,如果插入,需要移动其后的所有元素。

            //链表的缺点是,链表只能是一个接着一个的访问,这样就要用较长的时间来查找定位位于链表中间的元素。

            //LinkedListNode<T>LinkedList类包含,用LinkedListNode类,可以获得元素的上一个与下一个元素的引用。

 

            //简单介绍一下LinkedList<T>类的方法与属性

            //Count 返回链表中的元素个数

            //First 返回链表中的第一个节点,其返回的类型是一个节点类LinkedListNode<T>,用它可以迭代集合中的其它节点

            //Last 返回最后一个节点。。。。略

            //AddAfter() AddBefore() AddFirst() AddLast()

            //使用AddXXXX方法,可以在链表中添加元素分别是链表的头部与尾部,还有一个节点的前面与后面

            //Remove() RemoveFirst() RemoveLast() FirstLast分别删除链表的头部元素与尾表元素 , Remove是删除指定的一个匹配对像

            //Clear()清除所有的元素

            //Contains() 搜索一个元素,如果找到返回TRUE找不到返回FALSE

            //Find() 从链表头开始找一个元素,并返回他的节点类,LinkedListNode<T>

            //FindLast() Find()类似,不同的是从尾部来搜

 

            //下面开始写示例,示例中使用了一个链表LinkedList<T>与一个列表List<T>

            //链表包含文档,与我们上一个队列的例子相同,但文档有一个优先级。在链表中,文档按优先级来排序,如查多个文档优先级相同

            //则按插入时间来决定优先排序

            //链表添加文档对象时,它们应放在优先级相同的最后一个文档后面,例如:要加一个文档,优先级数是3,那么,我们应放在3级文档组里的最后一个,因为,此时他一定最晚的

 

            PriorityDocumentManager man = new PriorityDocumentManager() ;

 

            man.AddDocument( new Document( "" , "nihao" , 8 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 3 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 4 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 8 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 9 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

 

            man.DispalyAllNodes();

 

            Console.Read();

        }

    }

 

    class Document

    {

        private string title;

 

        public string Title

        {

            get { return title; }

            set { title = value; }

        }

        private string content;

 

        public string Content

        {

            get { return content; }

            set { content = value; }

        }

        private int priority;

 

        public int Priority

        {

            get { return priority; }

            set { priority = value; }

        }

 

        public Document(string title, string content, byte priority)

        {

            this.priority = priority;

            this.title = title;

            this.content = content;

        }

    }

 

    class PriorityDocumentManager

    {

        //docList包含所有的文档

        private readonly LinkedList<Document> documentList ;

        //proiorityNodes包含最多10个元素的引用

        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));

            }

        }

 

        /// <summary>

        /// 本方法用来添加文档

        /// </summary>

        /// <param name="d">要添加的文档对象</param>

        public void AddDocument(Document d)

        {

            if (d == null)

            {

                //如果文档为空,抛出异常

                throw new ArgumentNullException("d");

            }

 

            //调用添加方法

            AddDocumentToPriorityNode(d,d.Priority);

        }

 

        /// <summary>

        /// 递归方法

        /// </summary>

        /// <param name="d">要添加的文档对象</param>

        /// <param name="p">优先级</param>

        private void AddDocumentToPriorityNode(Document doc, int priority)

        {

            if (priority > 9 || priority < 0)

            {

                throw new ArgumentException( "优先级异常");

            }

 

            if (this.priorityNodes[priority].Value == null)

            {

                priority --;

 

                if (priority >= 0)

                {

                    AddDocumentToPriorityNode(doc, priority);

                }

                else

                {

                    this.documentList.AddLast(doc);

                    this.priorityNodes[doc.Priority] = this.documentList.Last;

                }

 

                return;

            }

            else

            {

                LinkedListNode<Document> priorityNode = this.priorityNodes[priority];

 

                if (priority == doc.Priority)

                {

                    this.documentList.AddAfter(priorityNode, doc);

                    this.priorityNodes[doc.Priority] = priorityNode.Next;

                }

                else

                {

                    LinkedListNode<Document> firstPriorityNode = priorityNode;

 

                    while (firstPriorityNode.Previous != null && firstPriorityNode.Previous.Value.Priority == priorityNode.Value.Priority )

                    {

                        firstPriorityNode = priorityNode.Previous;

                    }

 

                    this.documentList.AddBefore(firstPriorityNode, doc);

                    priorityNodes[doc.Priority] = firstPriorityNode.Previous;

                }

            }

 

        }

 

        public void DispalyAllNodes()

        { 

            foreach( Document doc in this.documentList)

            {

                Console.WriteLine( "文档标题:{0} 文档内容:{1} 优先级:{2}" , doc.Title , doc.Content ,doc.Priority);

            }

        }

 

        //public Document GetDocument()

        //{

        //    Document doc = this.documentList.First.Value;

        //    this.documentList.RemoveFirst();

        //    return doc;

        //}

    }

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 集合

{

    class 链表

    {

        public static void Main()

        { 

            //LinkedList<T>集合类没有非泛型类的版本,它是一个双向链表,它的元素指向元素的前一个与后一个元素

            //链表的优点是:如果要插入一个元素到链表的中间位置,会非常的快,

            //原因是,如果插入,只需要修改上一个元素的Next 与 下一个元素的Previous的引用则可。

            //ArrayList列表中,如果插入,需要移动其后的所有元素。

            //链表的缺点是,链表只能是一个接着一个的访问,这样就要用较长的时间来查找定位位于链表中间的元素。

            //LinkedListNode<T>LinkedList类包含,用LinkedListNode类,可以获得元素的上一个与下一个元素的引用。

 

            //简单介绍一下LinkedList<T>类的方法与属性

            //Count 返回链表中的元素个数

            //First 返回链表中的第一个节点,其返回的类型是一个节点类LinkedListNode<T>,用它可以迭代集合中的其它节点

            //Last 返回最后一个节点。。。。略

            //AddAfter() AddBefore() AddFirst() AddLast()

            //使用AddXXXX方法,可以在链表中添加元素分别是链表的头部与尾部,还有一个节点的前面与后面

            //Remove() RemoveFirst() RemoveLast() FirstLast分别删除链表的头部元素与尾表元素 , Remove是删除指定的一个匹配对像

            //Clear()清除所有的元素

            //Contains() 搜索一个元素,如果找到返回TRUE找不到返回FALSE

            //Find() 从链表头开始找一个元素,并返回他的节点类,LinkedListNode<T>

            //FindLast() Find()类似,不同的是从尾部来搜

 

            //下面开始写示例,示例中使用了一个链表LinkedList<T>与一个列表List<T>

            //链表包含文档,与我们上一个队列的例子相同,但文档有一个优先级。在链表中,文档按优先级来排序,如查多个文档优先级相同

            //则按插入时间来决定优先排序

            //链表添加文档对象时,它们应放在优先级相同的最后一个文档后面,例如:要加一个文档,优先级数是3,那么,我们应放在3级文档组里的最后一个,因为,此时他一定最晚的

 

            PriorityDocumentManager man = new PriorityDocumentManager() ;

 

            man.AddDocument( new Document( "" , "nihao" , 8 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 3 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 4 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 8 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 9 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

            man.AddDocument( new Document( "" , "nihao" , 1 ) ) ;

 

            man.DispalyAllNodes();

 

            Console.Read();

        }

    }

 

    class Document

    {

        private string title;

 

        public string Title

        {

            get { return title; }

            set { title = value; }

        }

        private string content;

 

        public string Content

        {

            get { return content; }

            set { content = value; }

        }

        private int priority;

 

        public int Priority

        {

            get { return priority; }

            set { priority = value; }

        }

 

        public Document(string title, string content, byte priority)

        {

            this.priority = priority;

            this.title = title;

            this.content = content;

        }

    }

 

    class PriorityDocumentManager

    {

        //docList包含所有的文档

        private readonly LinkedList<Document> documentList ;

        //proiorityNodes包含最多10个元素的引用

        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));

            }

        }

 

        /// <summary>

        /// 本方法用来添加文档

        /// </summary>

        /// <param name="d">要添加的文档对象</param>

        public void AddDocument(Document d)

        {

            if (d == null)

            {

                //如果文档为空,抛出异常

                throw new ArgumentNullException("d");

            }

 

            //调用添加方法

            AddDocumentToPriorityNode(d,d.Priority);

        }

 

        /// <summary>

        /// 递归方法

        /// </summary>

        /// <param name="d">要添加的文档对象</param>

        /// <param name="p">优先级</param>

        private void AddDocumentToPriorityNode(Document doc, int priority)

        {

            if (priority > 9 || priority < 0)

            {

                throw new ArgumentException( "优先级异常");

            }

 

            if (this.priorityNodes[priority].Value == null)

            {

                priority --;

 

                if (priority >= 0)

                {

                    AddDocumentToPriorityNode(doc, priority);

                }

                else

                {

                    this.documentList.AddLast(doc);

                    this.priorityNodes[doc.Priority] = this.documentList.Last;

                }

 

                return;

            }

            else

            {

                LinkedListNode<Document> priorityNode = this.priorityNodes[priority];

 

                if (priority == doc.Priority)

                {

                    this.documentList.AddAfter(priorityNode, doc);

                    this.priorityNodes[doc.Priority] = priorityNode.Next;

                }

                else

                {

                    LinkedListNode<Document> firstPriorityNode = priorityNode;

 

                    while (firstPriorityNode.Previous != null && firstPriorityNode.Previous.Value.Priority == priorityNode.Value.Priority )

                    {

                        firstPriorityNode = priorityNode.Previous;

                    }

 

                    this.documentList.AddBefore(firstPriorityNode, doc);

                    priorityNodes[doc.Priority] = firstPriorityNode.Previous;

                }

            }

 

        }

 

        public void DispalyAllNodes()

        { 

            foreach( Document doc in this.documentList)

            {

                Console.WriteLine( "文档标题:{0} 文档内容:{1} 优先级:{2}" , doc.Title , doc.Content ,doc.Priority);

            }

        }

 

        //public Document GetDocument()

        //{

        //    Document doc = this.documentList.First.Value;

        //    this.documentList.RemoveFirst();

        //    return doc;

        //}

    }

}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值