Linkitetty lista
Linkitetty lista on tietojenkäsittelytieteessä yksi ohjelmoinnissa käytettävistä perustietorakenteista. Se koostuu joukosta solmuja eli alkioita, jotka sisältävät tietokenttien lisäksi viittauksen (”linkin”) joko seuraavaan solmuun tai seuraavaan ja edelliseen solmuun. Linkitetyissä listoissa solmun voi lisätä ja poistaa vakioajassa. Linkitetty lista ei mahdollista hakua taulukon tapaisella suoralla haulla. Linkitetyt listat voivat olla yksisuuntaisia (yhteen suuntaan linkitettyjä), kaksisuuntaisia (kahteen suuntaan linkitettyjä) tai renkaaksi linkitettyjä.
Linkitettyjä listoja pystyy toteuttamaan useimmilla ohjelmointikielillä. Lisp- ja Scheme-kielissä tietorakenne ja listaoperaatiot ovat sisäänrakennettuna. C- ja C++-kielissä linkitetyt listat on luontevaa toteuttaa osoittimien avulla.
Toteutus
[muokkaa | muokkaa wikitekstiä]Toisinen kuin lineaarinen lista (katso taulukko) linkitetty lista on joustavampi, koska muistivarauksen ei tarvitse olla peräkkäisistä muistipaikoista. Linkitetyssä listassa jokainen solmu sisältää linkin seuraavaan solmuun listassa. Ohjelma voi pitää yllä muuta tietoa listasta kuten sen pituuden.[1]
Tieto linkeistä voi vaatia hieman lisää muistia, mutta se voi myös säästää muistia, joka taulukossa olisi toistuvaa ja ei ole tarvetta varata muistipaikkoja joita ei tulla käyttämään. Lisäksi linkitetystä listasta on helppoa poistaa ja lisätä tietoa väliin muuttamalla linkkejä. Satunnaisiin paikkoihin viittaaminen on myös nopeampaa ja tietorakenteet voivat olla monimutkaisempia.[1]
Solmut voivat viitata toisiinsa seuraavasti ja ohjelman on tiedettävä mistä lista alkaa.[1]
ALKU -> (solmu 1) -> (solmu 2) -> (solmu 3) -> LOPPU
Havainnollisempi esimerkki toteutuksesta:
typedef struct solmu;
struct solmu {
int arvo;
solmu *seuraava; // solmussa on linkki (osoitin) seuraavaan solmuun
}
solmu s1;
solmu s2;
s1.seuraava = &s2; // solmuun asetetaan seuraava solmu
s2.seuraava = NULL; // viimeinen ei viittaa mihinkään solmuun
Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ a b c Knuth, Donald: The art of computer programming : Fundamental algorithms, s. 254–256. (Third Edition) Addison Wesley, 1997. ISBN 0-201-89683-4 (englanniksi)