Gyakorlat, 12. hét: láncolt listák II.
Czirkos Zoltán · 2024.11.16.
Láncolt listák használata algoritmusokban.
Felkészülés a gyakorlatra:
- A listákról szóló előadás anyagának megértése.
- A listákról szóló első gyakorlat átismétlése.
Gondoljuk végig, az alábbi problémákhoz milyen adatszerkezetet érdemes használni.
- Átlagnál kisebbek. Egy program számokat olvas be, amelyek közül ki kell írni az átlagnál kisebbeket. Nem tudjuk, hány szám lesz.
- Prímszámok. Egy program számokat olvas be, és a beolvasottak közül csak a prímszámokat írja ki.
- Visszafelé. Számokat olvasunk be, és visszafelé sorrendben ki kell írni az átlagnál kisebbeket.
- Százezer. Számokat olvasunk be, maximum százezret. Ki kell írni az átlagnál kisebbeket.
- Szöveg. Be kell olvasnunk egy tetszőlegesen hosszú sort a bemenetről (karakterek enterig).
- Buszok. A programunk egy közlekedési társaság buszjáratait tárolja. Minden járatnak van egy száma, illetve van két végállomása, és közte tetszőlegesen sok megálló.
- Amőba. Amőba játékot írunk. A 13×13-as pályára a játékosok felváltva
o
ésx
jeleket tesznek, amelyek száma így változik. Nem tudjuk előre, mennyi lesz, hiszen lehet hogy hamar vége van a játéknak, lehet mindkét játékos ügyes, és szinte megtelik a pálya. - Számok. Beolvasunk számokat a billentyűzetről, és meg kell mondanunk, hogy melyik szám hányszor szerepelt.
- Betűk. Beolvasunk karaktereket a billentyűzetről, és meg kell mondanunk, hogy melyik kisbetű (abc…z) hányszor szerepelt.
NZH feladat
Definiáljunk típust, mely alkalmas prímtényezők (alap, kitevő) láncolt listában való tárolására!
- Írjunk függvényt, mely átvesz egy ilyen listát, és kiír egy prímtényezős felbontást a következő alakban:
2^2 * 3^1 * 5^1
. (Ha gondolod, ezen a ponton írj egy rövid programrészt, amellyel teszt adatokat tudsz előállítani. Később ez a programrész eldobható.) - Írjunk függvényt, mely átvesz egy pozitív egészet, és visszaadja a prímtényezős felbontását tényezők szerint növekvő sorrendben egy listában!
- Írjunk függvényt, mely paraméterként átvesz két prímtényezős felbontást, és a legnagyobb közös osztó prímtényezős felbontását adja vissza egy új listában! (Ehhez meg kell keresni azokat az alapokat, amelyek mindkét felbontásban szerepelnek, és mindig a kisebbik kitevőt választani.)
Egészítsük ki a fentieket teljes programmá, melyben két pozitív egész felbontásán és legnagyobb közös osztójának meghatározásán keresztül példát mutatunk az elkészült függvények alkalmazására!
Tipp
A legnagyobb közös osztó a prímtényezős felbontások ismeretében O(n) lépésben is meghatározható, az összefésülés algoritmusával. Ha nem ilyen lett a kódod, oldd meg így is a feladatot!
Az alábbi program beolvas egy szöveget fájl vége jelig, majd kiírja azt visszafelé. Elmélkedjünk rajta, miért!
#include <stdio.h>
void forditva_kiir(void) {
char c;
if (scanf("%c", &c) == 1) {
forditva_kiir();
printf("%c", c);
}
}
int main(void) {
forditva_kiir();
return 0;
}
Írjunk meg ezt a programot úgy, hogy nem használunk rekurziót, hanem magunk építünk vermet!