欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#如何自定义线性节点链表集合

程序员文章站 2023-12-02 23:03:28
本例子实现了如何自定义线性节点集合,具体代码如下: using system; using system.collections; using system....

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

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

注意:

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

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

 运行结果如下:

C#如何自定义线性节点链表集合

示例下载地址:c#自定义线性节点链表集合

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。