Grafična predstavitev
LinkedList v C#
Dejansko bomo mi uporabljali LinkedListNode (no, različico, ki pozna le naslednika, ne pa tudi prednika)
Elementi ver. seznama
Komponente
public class Vozel<T> {
private T podatek; // hranimo podatke tipa T
private Vozel<T> naslednji; // referenca na naslednjega
// konstruktorji
// Lastnosti: Vsebina, Nasl
Lastnosti
public T Vsebina {
get { return this.podatek; }
set { this.podatek = value; }
}
public Vozel<T> Nasl{
get { return this.naslednji; }
set { this.naslednji = value; }
}
public Vozel(){
this.Vsebina = default(T);
// kot je privzeta vrednost za tip T
this.Nasl = null;
}
Nekaj primerov
1. primer
2.primer
1. primer
Vozel<int> prvi = new Vozel<int>();
Vozel<int> drugi = new Vozel<int>();
Vozel<int> tretji = new Vozel<int>();
prvi.Vsebina = 12;
drugi.Vsebina = 42;
drugi.Nasl = prvi;
tretji.Vsebina = 13;
tretji.Nasl = drugi;
Vozel<int> zac = tretji;
prvi = null; drugi = null; tretji = null; // znebimo se naslovov
Console.WriteLine(zac.Vsebina); // vsebina prvega v verigi
Console.WriteLine(zac.Nasl.Vsebina); // vsebina drugega v verigi
Console.WriteLine(zac.Nasl.Nasl.Vsebina); // vsebina tretjega v verigi
zac.Vsebina = 111;
zac.Nasl.Nasl.Vsebina = 1;
Console.WriteLine(zac.Vsebina); // vsebina prvega v verigi
Console.WriteLine(zac.Nasl.Vsebina); // vsebina drugega v verigi
Console.WriteLine(zac.Nasl.Nasl.Vsebina); // vsebina tretjega v verigi
Dodaj na začetek
// dodaj na začetek
Vozel<int> nov = new Vozel<int>();
nov.Vsebina = 1000;
// povežemo
nov.Nasl = zac;
// dobili smo nov začetek
zac = nov;
Testni program
| Vozel<int> prvi = new Vozel<int>(); Vozel<int> drugi = new Vozel<int>(); Vozel<int> tretji = new Vozel<int>(); prvi.Vsebina = 12; drugi.Vsebina = 42; drugi.Nasl = prvi; tretji.Vsebina = 13; tretji.Nasl = drugi; |
|
Vozel<int> zac = tretji;
prvi = null; drugi = null; tretji = null; // znebimo se naslovov
Console.WriteLine("vsebina prvega v verigi: " + zac.Vsebina); // vsebina prvega v verigi
Console.WriteLine("vsebina drugega v verigi: " + zac.Nasl.Vsebina); // vsebina drugega v verigi
Console.WriteLine("vsebina tretjega v verigi: " + zac.Nasl.Nasl.Vsebina); // vsebina tretjega
// dodaj na začetek
Vozel<int> nov = new Vozel<int>(); nov.Vsebina = 1000;
// povežemo
nov.Nasl = zac;
// dobili smo nov začetek
zac = nov;
Console.WriteLine("vsebina prvega v verigi: " + zac.Vsebina); // vsebina prvega v verigi
Console.WriteLine("vsebina drugega v verigi: " + zac.Nasl.Vsebina); // vsebina drugega v verigi
Console.WriteLine("vsebina tretjega v verigi: " + zac.Nasl.Nasl.Vsebina); // vsebina tretjega
// sedaj imamo še četrtega
Console.WriteLine("vsebina četrtega v verigi: " + zac.Nasl.Nasl.Nasl.Vsebina); // vsebina četrtega
Izpiši
Ideja:
Naslednji v verigi:
Konec:
IzpisVerige
public static void IzpisVerige<T>(Vozel<T> zacSez)
{
// izpišemo vsebino verige, na katere začetek kaže zacSez
Vozel<T> kjeSmo; // kazalec za premikanje
kjeSmo = zacSez;
Console.Write("Začetek: ");
while (zacSez != null) // do konca seznama
{
Console.Write(zacSez.Vsebina + " -> ");
zacSez = zacSez.Nasl; // na naslednji vozel
}
Console.WriteLine("KONEC");
}
Dodaj vsebino tabele na začetek
public static Vozel<T> VstaviTab<T> (T[] pod)
{
// Sestavi novo verigo, kamor vstavi podatke iz tabele pod
Vozel<T> prvi = null; // začetek verige
for (int i = 0; i < pod.Length; i++)
{
Vozel<T> nov = new Vozel<T>(); // vozel za nove podatke
nov.Vsebina = pod[i]; nov.Nasl = prvi; // dodamo na začetek
prvi = nov; // nov začetek
}
return prvi;
}
In še test
int[] podatki = { 11, 23, 34, 45, 555, 67 };
Vozel<int> verigaŠtevil = VstaviTab(podatki);
// izpis
Console.WriteLine("Prvi izpis: ");
IzpisVerige(verigaŠtevil);
// in še enkrat
Console.WriteLine("še drugi izpis: ");
IzpisVerige(verigaŠtevil);
Razred Vozel – dodatni konstruktorji
public Vozel(T x) : this(){
this.Vsebina = x;
}
Razred Vozel – dodatni konstruktorji
public Vozel(V v) : this(){
this.Nasl = v;
}
Razred Vozel – dodatni konstruktorji
public Vozel(Vozel v, T x):this(x) {
this.Nasl = v;
}
Konstruktorji razreda Vozel