Labor, 10. hét: gyakorlás (szombat)

Czirkos Zoltán · 2018.09.14.

Gyakorlófeladatok.

1. Haladási napló, nagy házi feladat

A szokásos módon frissítsd a haladási naplódat az admin portálon!

Ezen a laboron lehetőséged van úgy dolgozni a nagy házi feladatodon, hogy a laborvezetőtől bármikor segítséget tudsz kérni. Foglalkozhatsz magával a programmal, vagy a hozzá tartozó dokumentációkkal is. Ha ezt választod, akkor egész órára ez a feladatod. Ha nem, akkor lentebb gyakorlófeladatokat találsz.

2. Tömbből lista

Definiálj listát, amelyik valós számokat tartalmaz! Írj függvényt, amelyik valós számokat tartalmazó tömböt vesz át paraméterként, és létrehoz egy újonnan létrehozott listát, amelybe a megadott számokat másolja! Egy másik függvénnyel gondoskodj a lista felszabadításáról is.

Ennek a feladatnak a megoldását fel tudod használni a többi feladatban a teszteléshez.

3. Hány különböző?

Készíts függvényt, mely megszámolja, hogy a listában hány különböző érték van! Az eredeti listát ne változtasd meg!

4. Nincs benne ismétlés

Írj függvényt, amely úgy módosít egy paraméterként kapott listát, hogy abban ne legyen kétszer egymás után ugyanaz az elem! Pl. ha a bemeneti lista 1,1,5,7,4,4,1,5,5,5,6, a megváltozott lista tartalma legyen 1,5,7,4,1,5,6. (Figyelj arra, hogy ehhez csak egymás melletti elemeket kell vizsgálni. Egymástól távol szerepelhet többször is ugyanaz a szám.)

A függvény megírása előtt gondold át, fog-e módosulni itt a lista eleje mutató!

5. Elejéről a végére

Kis ZH volt

Írj függvényt, amely egy lista legelső elemét a lista végére helyezi át! (Például az 1,2,3,4,5 listából így 2,3,4,5,1 lesz.) Ha kettőnél kevesebb elem van, akkor ne csináljon semmit.

Készíts rajzot, amely a listakezelést mutatja számozott lépésekkel! Írj programrészt, amely létrehoz két listaelemet, és a függvénnyel áthelyezi az első elemet a lista végére!

Megoldás

typedef struct ListaElem {
    int szam;
    struct ListaElem *kov;
} ListaElem;

ListaElem *elso_vegere(ListaElem *elso) {
    if (elso == NULL) return;
    if (elso->kov == NULL) return;

    ListaElem *iter
    for (iter = elso; iter->kov != NULL; iter = iter->kov)
        ;
    ListaElem *masodik = elso->kov;
    iter->kov = elso;
    elso->kov = NULL;
    return masodik;
}

ListaElem *eleje;

eleje = (ListaElem*) malloc(sizeof(ListaElem));
eleje->szam = 3;
eleje->kov = (ListaElem*) malloc(sizeof(ListaElem));
eleje->kov->szam = 4;
eleje->kov->kov = NULL;

eleje = elso_vegere(eleje);

6. Negatívak törlése

Kis ZH volt

Írj függvényt, amely átvesz egy valós számokból álló listát, és kitörli a negatív értékű elemeket! A működés áttekintéséhez készíts ábrát! Az elkészült függvények alkalmazását rövid programrészlettel szemléltesd; a listát feltöltöttnek tekintheted.

Módosul ettől a lista elejét mutató pointer?

7. Listák összefűzése

Kis ZH volt

Írj függvényt, amely átvesz két láncolt listát az eddig használt típusból, és az első lista végéhez fűzi a másodikat. A függvény az új lista kezdőcímével kell visszatérjen. Feltételezhetjük, hogy az átvett eredeti listákat és kezdőcímeiket a hívás helyén már nem használjuk tovább. A függvény akkor is helyesen működjön, ha bármelyik lista üres!

A működés áttekintéséhez készíts ábrát! Az elkészült függvény alkalmazását rövid programrészlettel szemléltesd!