3. Jednosmerný lineárny zoznam

3.3  Prehľadávanie zoznamu, výpis prvkov

Na prvý uzol (začiatok) zoznamu, ukazuje smerník z, koniec zoznamu je signalizovaný hodnotou NULL ukazovateľa dalsi v poslednom uzle. Prehľadávať zoznam znamená prechádzať cez zoznam od prvého prvku po posledný, uzol po uzle, s cieľom nájsť uzol spĺňajúci nejakú podmienku, prípadne testovať, či aktuálny uzol vyhovuje nejakej podmienke a v závislosti od toho vykonať na ňom nejakú operáciu napr. vypísať hodnotu na obrazovku, zmeniť hodnotu, odstrániť uzol zo zoznamu atď.

Zoznamom prechádzame postupne (v cykle) pomocou ukazovateľa od začiatku až po koniec zoznamu. Funkcia, ktorá vypíše všetky prvky lineárneho zoznamu môže vyzerať nasledovne:

void vypis(TPrvok *p)
{
  while (p != NULL) {
    printf ("\nprvok: %c ",  p->hodnota);
    p = p->dalsi;
  }
}
OBRÁZOK

Parameter p tejto procedúry je ukazovateľ na začiatok vypisovaného zoznamu. To znamená, že volaním

vypis(z);

vypíšeme zoznam, na ktorého začiatok ukazuje smerník z.

  Funkciu môžeme samozrejme doplniť rôznymi "efektami", aby bol výstup na obrazovke krajší. Ako parameter možno do funkcie "poslať" vo všeobecnosti ukazovateľ na ľubovoľný uzol, od ktorého potrebujeme prvky zoznamu vypísať.


Ak chceme v zozname nájsť uzol, ktorý vyhovuje nejakej podmienke, postupujeme vlastne rovnako ako pri vypisovaní prvkov zoznamu. Prechádzame zoznamom uzol po uzle a testujeme, či uzol vyhovuje podmienke. Toto robíme až kým nenájdeme uzol s požadovanou vlastnosťou alebo kým nenarazíme na koniec zoznamu. Funkcia môže mať potom tvar:

TPrvok *najdi(TPrvok *p, int co)
{ 
  if (p == NULL) return(NULL);
  else {
    while ((p != NULL) && (p->hodnota != co)) p = p->dalsi;
    return (p == NULL ? NULL : p);	
  }
}

Naša funkcia má 2 parametre: ukazovateľ na začiatok prehľadávaného zoznamu (resp. na uzol, od ktorého treba zoznam prehľadávať) a hľadaný znak. Funkcia vracia pointer na hľadaný uzol resp. NULL ak sa v zozname taký nenachádza (alebo je zoznam prázdny).


Rovnaký princíp ako pri výpise prvkov zoznamu resp. hľadaní nejakého prvku sa uplatňuje aj ak chceme aplikovať nejakú operáciu (urobiť zmenu) na všetkých (alebo niektorých) prvkoch zoznamu príp. zrušiť celý zoznam. Túto úlohu môžeme vyjadriť nasledujúcim algoritmom:

while nie sme na konci zoznamu  do
{
  vykonaj operáciu;
  prejdi na nasledujúci prvok;
}


Precvičme si

  Napíšte funkciu, ktorá zruší celý lineárny zoznam. Uvažujeme náš "pokusný" lineárny zoznam, ktorého prvky sú znaky.

[Riešenie]

  V prvkoch lineárneho zoznamu sú uložené celé čísla. Napíšte funkciu, ktorá určí počet prvkov zoznamu, ktoré obsahujú číslo deliteľné piatimi.
Napr. zo zoznamu 1, 5, 10, 7, 5 bude výsledná hodnota 3.

[Riešenie]

  Napíšte funkciu, ktorá zistí, či sú dva lineárne zoznamy celých čísel rovnaké. To znamená, či sú tvorené rovnakými prvkami v rovnakom poradí.

[Riešenie]

  Vytvorte program umožňujúci vo forme menu

  • vytvoriť lineárny zoznam, naplniť ho hodnotami, vypísať hodnoty zo zoznamu (hodnotami jednotlivých uzlov nech sú informácie o študentoch - meno, body z testu)
  • zmeniť hodnotu vybraného uzla zoznamu
  • zistiť, či sa hľadaný uzol (študent) nachádza v zozname
  • zrušiť celý zoznam
  • uložiť hodnoty zoznamu do súboru a naopak, načítať ich zo súboru do zoznamu

[Riešenie]