Что такое односвязный список и как его реализовать - C#
Формулировка задачи:
Господа, что такое односвязный список и как его реализовать в шарпе.
Всем спасибо
Решение задачи: «Что такое односвязный список и как его реализовать»
textual
Листинг программы
namespace ConsoleApplication6 {
class Program {
static void Main(string[] args) {
SinglyLinkedList<string> l = new SinglyLinkedList<string>();
SinglyLinkedNode<string> first = new SinglyLinkedNode<string>() { Value = "11111111" };
l.AddFirstNode(first);
l.AddFirstNode(new SinglyLinkedNode<string>() { Value = "22222222" });
l.AddFirstNode(new SinglyLinkedNode<string>() { Value = "33333333" });
l.AddLastNode(new SinglyLinkedNode<string>() { Value = "44444444" });
l.AddLastNode(new SinglyLinkedNode<string>() { Value = "55555555" });
l.AddLastNode(first);
l.AddAfter(0, new SinglyLinkedNode<string>() { Value = "after" });
l.AddAfter(6, new SinglyLinkedNode<string>() { Value = "after" });
foreach (SinglyLinkedNode<string> node in l)
Console.WriteLine(node.Value);
Console.ReadKey();
}
}
public class SinglyLinkedNode<T> where T : class {
SinglyLinkedNode<T> nextNode;
public SinglyLinkedNode<T> NextNode { get { return nextNode; } set { nextNode = value; } }
public T Value { get; set; }
public void AddAfter(SinglyLinkedNode<T> node) {
if (node != null) {
SinglyLinkedNode<T> currentNext = nextNode;
nextNode = node;
if (currentNext != null)
node.AddAfter(currentNext);
}
}
}
public class SinglyLinkedNodeEnumerator<T> : IEnumerator where T : class {
readonly SinglyLinkedNode<T> firstNode;
SinglyLinkedNode<T> current;
public SinglyLinkedNodeEnumerator(SinglyLinkedNode<T> firstNode) {
this.firstNode = current = firstNode;
}
public object Current {
get {
SinglyLinkedNode<T> befor = current;
current = current.NextNode;
return befor;
}
}
public bool MoveNext() {
return current != null;
}
public void Reset() {
current = firstNode;
}
}
public class SinglyLinkedList<T> : IEnumerable where T : class {
SinglyLinkedNode<T> firstNode;
SinglyLinkedNode<T> lastNode;
public SinglyLinkedNode<T> FirstNode { get { return firstNode; } }
public SinglyLinkedNode<T> LastNode { get { return lastNode; } }
public SinglyLinkedList() {
}
public SinglyLinkedList(SinglyLinkedNode<T> node) {
if (node != null)
firstNode = lastNode = node;
}
public void AddFirstNode(SinglyLinkedNode<T> node) {
node.NextNode = firstNode;
firstNode = node;
if (lastNode == null)
lastNode = node;
}
public void AddLastNode(SinglyLinkedNode<T> node) {
lastNode.NextNode = node;
lastNode = node;
if (firstNode == null)
firstNode = node;
}
public void AddAfter(int index, SinglyLinkedNode<T> node) {
SinglyLinkedNode<T> currentNode = firstNode;
for (int idx = 0; idx < index; idx++)
if (currentNode != null)
currentNode = currentNode.NextNode;
if (currentNode != null)
currentNode.AddAfter(node);
}
public IEnumerator GetEnumerator() {
return new SinglyLinkedNodeEnumerator<T>(firstNode);
}
}
}