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]
|
|