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#自定义线性节点链表集合
(请使用vs2015打开,如果为其他版本,请将program.cs中的内容复制到自己创建的控制台程序中)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读