zoukankan      html  css  js  c++  java
  • C# 基于泛型的自定义线性节点链表集合示例

    本例子实现了如何自定义线性节点集合,具体代码如下:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    
    namespace LineNodeDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                LineNodeCollection lineNodes = new LineNodeCollection();
                lineNodes.Add(new LineNode("N1") { Name = "Microsoft" });
                lineNodes.Add(new LineNode("N2") { Name = "Lenovo" });
                lineNodes.Add(new LineNode("N3") { Name = "Apple" });
                lineNodes.Add(new LineNode("N4") { Name = "China Mobile" });
                Console.WriteLine("1、显示全部:");
                lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
                Console.WriteLine("2、删除编号为N2的元素:");
                lineNodes.Remove("N2");
                lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
                Console.WriteLine("3、删除索引为1的元素:");
                lineNodes.RemoveAt(1);
                lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
                Console.WriteLine("4、显示索引为0元素的名称:");
                Console.WriteLine(lineNodes[0].Name);
                Console.WriteLine("5、显示编号为N4元素的名称:");
                Console.WriteLine(lineNodes["N4"].Name);
                Console.WriteLine("6、清空");
                lineNodes.Clear();
                lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
                Console.ReadKey();
            }
        }
    
        static class Utility
        {
            public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
            {
                foreach(var r in source)
                {
                    action(r);
                }
            }
        }
    
        class LineNodeCollection : IEnumerable<LineNode>
        {
            public IEnumerator<LineNode> GetEnumerator()
            {
                return new LineNodeEnumerator(this.firstLineNode);
            }
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return this.GetEnumerator();
            }
    
            public LineNode this[int index]
            {
                get
                {
                    LineNode _lineNode= this.firstLineNode;
                    for (int i=0;i<=index;i++)
                    {
                        if (_lineNode != null)
                        {
                            if(i<index)
                            {
                                _lineNode = _lineNode.Next;
                                continue;
                            }
                            else
                            {
                                return _lineNode;
                            }
                        }
                        else break;
                    }
                    throw new IndexOutOfRangeException("超出集合索引范围");
                }
            }
    
            public LineNode this[string id]
            {
                get
                {
                    LineNode _lineNode = this.firstLineNode;
                    for (int i = 0; i < this.Count; i++)
                    {
                       if(_lineNode.ID == id)
                       {
                            return _lineNode;
                       } 
                       else
                       {
                            _lineNode = _lineNode.Next;
                       }
                    }
                    throw new IndexOutOfRangeException("未能在集合中找到该元素");
                }
            }
    
            LineNode firstLineNode;
            LineNode lastLineNode;
            public void Add(LineNode lineNode)
            {
                this.Count++;
                if(this.firstLineNode == null)
                {
                    this.firstLineNode = lineNode;
                }
                else
                {
                    if (this.firstLineNode.Next == null)
                    {
                        lineNode.Previous = this.firstLineNode;
                        this.firstLineNode.Next = lineNode;
                        this.lastLineNode = this.firstLineNode.Next;
                    }
                    else
                    {
                        lineNode.Previous = this.lastLineNode;
                        this.lastLineNode.Next = lineNode;
                        this.lastLineNode = this.lastLineNode.Next;
                    }
                }
            }
    
            public int Count
            {
                private set;get;
            }
    
            public int IndexOf(string id)
            {
                LineNode _lineNode = this.firstLineNode;
                for (int i = 0; i < this.Count; i++)
                {
                    if (_lineNode.ID == id)
                    {
                        return i;
                    }
                    else
                    {
                        _lineNode = _lineNode.Next;
                    }
                }
                throw new IndexOutOfRangeException("未能在集合中找到该元素");
            }
    
            public void Clear()
            {
                this.firstLineNode = null;
                this.lastLineNode = null;
                this.Count = 0;
                this.GetEnumerator().Reset();
            }
    
            public void RemoveAt(int index)
            {
                if (this.Count < index) throw new InvalidOperationException("超出集合索引范围");
                LineNode _currentLineNode = this[index];
                if (_currentLineNode.Previous == null)
                {
                    _currentLineNode = _currentLineNode.Next;
                    this.firstLineNode = _currentLineNode;
                }
                else 
                {    
                    LineNode _lineNode = this.firstLineNode;
                    for (int i = 0; i <= index - 1; i++)
                    {
                        if (i < index - 1)
                        {
                            _lineNode = _lineNode.Next;
                            continue;
                        }
                        if (i == index - 1)
                        {
                            if (_currentLineNode.Next != null)
                            {
                                _lineNode.Next = _lineNode.Next.Next;
                            }
                            else
                            {
                                this.lastLineNode = _lineNode;
                                _lineNode.Next = null;
                            }
                            break;
                        }
                    }
                }
                this.Count--;
            }
    
            public void Remove(string id)
            {
                int _index = this.IndexOf(id);
                this.RemoveAt(_index);
            }
    
            public LineNode TopLineNode { get { return this.firstLineNode; } }
            public LineNode LastLineNode { get { return this.lastLineNode; } }
        }
    
        class LineNodeEnumerator : IEnumerator<LineNode>
        {
            LineNode topLineNode;
            public LineNodeEnumerator(LineNode topLineNode)
            {
                this.topLineNode = topLineNode;
            }
            public LineNode Current
            {
                get
                {
                    return this.lineNode;
                }
            }
    
            object IEnumerator.Current
            {
                get
                {
                    return this.Current;
                }
            }
    
            public void Dispose()
            {
                this.lineNode = null;
            }
    
            LineNode lineNode;
    
            public bool MoveNext()
            {
                if(this.lineNode == null)
                {
                    this.lineNode = this.topLineNode;
                    if (this.lineNode == null) return false;
                    if (this.lineNode.Next == null)
                        return false;
                    else
                        return true;
                }
                else
                {
                    if(this.lineNode.Next !=null)
                    {
                        this.lineNode = this.lineNode.Next;
                        return true;
                    }
                    return false;
                }
            }
    
            public void Reset()
            {
                this.lineNode = null;
            }
        }
    
    
        class LineNode
        {
            public LineNode(string id)
            {
                this.ID = id;
            }
            public string ID { private set; get; }
            public string Name {set; get; }
            public LineNode Next { set; get; }
            public LineNode Previous { set; get; }
        }
    }

    注意:

    ①这里所谓的线性节点指定是每个节点之间通过关联前后节点,从而形成链接的节点;

    ②本示例完全由博主原创,转载请注明来处。

    运行结果如下:

    示例下载地址:https://pan.baidu.com/s/1eS9UIzS 

    (请使用VS2015打开,如果为其他版本,请将Program.cs中的内容复制到自己创建的控制台程序中)

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/cncc/p/6664214.html
Copyright © 2011-2022 走看看