A láncolt lista implementáció minden esetben egy láncelem definiálásával kezdÅ‘dik. Jelen implementáció egy referenciát tartalmaz a következÅ‘ elemre, ettÅ‘l lesz egyszeresen láncolt a lista. A referencián kÃvül természetesen a láncelemnek tartalmaznia kell az értéket is.
namespace PeldaSajatAdatLancoltlista
{
public class ListaElem<T>
{
public ListaElem<T> Next { get; set; }
public T Value { get; set; }
}
}
A láncolt lista pár alap művelet implementációval. A példában a lista minden esetben a végén bővül.
using System.Collections;
using System.Collections.Generic;
namespace PeldaSajatAdatLancoltlista
{
public class SajatLancoltLista<T>: IEnumerable<T>
{
public ListaElem<T> Start { get; private set; }
public ListaElem<T> End { get; private set; }
public void Add(T value)
{
var next = new ListaElem<T> { Value = value };
//még üres a lista
if (Start == null)
{
Start = next;
End = next;
}
//már van elem a listában
else
{
End.Next = next;
End = next;
}
}
private bool Equals(T value, T other)
{
if (ReferenceEquals(value, other))
{
return true;
}
else
{
return value.Equals(other);
}
}
public bool Remove(T value)
{
ListaElem<T> previous = null;
ListaElem<T> current = Start;
while (current != null)
{
if (Equals(current.Value, value))
{
if (previous != null)
{
previous.Next = current.Next;
if (current.Next == null)
{
End = previous;
}
}
else
{
Start = Start.Next;
if (Start == null)
{
End = null;
}
}
return true;
}
previous = current;
current = current.Next;
}
return false;
}
public bool Contains(T value)
{
var current = Start;
while (current != null)
{
if (Equals(current.Value,value))
{
return true;
}
current = current.Next;
}
return false;
}
public IEnumerator<T> GetEnumerator()
{
var current = Start;
while (current != null)
{
var retval = current.Value;
current = current.Next;
yield return retval;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
Tesztelő program:
using System;
namespace PeldaSajatAdatLancoltlista
{
class Program
{
static void Main(string[] args)
{
var lancolt = new SajatLancoltLista<string>();
lancolt.Add("Hello");
lancolt.Add("World");
lancolt.Add("Pelda");
lancolt.Add("Lancolt");
Console.WriteLine("A láncolt lista elemei:");
foreach (var item in lancolt)
{
Console.WriteLine(item);
}
Console.WriteLine();
lancolt.Remove("Hello");
Console.WriteLine("A láncolt lista elemei törlés után:");
foreach (var item in lancolt)
{
Console.WriteLine(item);
}
bool vanbenne = lancolt.Contains("Hello");
Console.WriteLine("Van benne Hello: {0}", vanbenne);
Console.ReadKey();
}
}
}
A program kimenete:
$
A láncolt lista elemei:
Hello
World
Pelda
Lancolt
A láncolt lista elemei törlés után:
World
Pelda
Lancolt
Van benne Hello: False