Fizikus C labor

1. óra: ismerkedés a fejlesztőkörnyezettel2. óra: ciklusok3. óra: számelméleti feladatok
4. óra: számítás valós számokkal5. óra: sok adat beolvasása, tömbök6. óra: iteráció, könyvtári sztringkezelő függvények
7. óra: függvények és sztringek8. óra: cím szerinti és tömb paraméterek, struktúrák, dinamikus tömbök9. óra: rendezés, fájlkezelés, parancssori paraméterek
10. óra: állapotgép, szabványos I/O átirányítása11. óra: rekurzió, gyakorlás12. óra: láncolt listák, fák
13. óra: NHF beadás

Rajzoljunk a konzol ablakba Windowson

13. alkalom: láncolt listák, fák

0. feladat

Töltsd le a minima*LISTA* és *FA* kezelő programot: lista_fa.zip

1. feladat

Értsd meg a listás programot.
Egészítsd ki az alábbi értékeket visszaadó függvényekkel:
Elemszám.
Értékek összege.
A programban írd ki az elemek átlagát.

2. feladat

Értsd meg a fás programot.
Egészítsd ki az alábbi értékeket visszaadó függvényekkel:
Elemszám.
Értékek összege.
Levél elemek száma. (Levél elem: egyetlen leszármazottja sincs.)
A programban írd ki az elemek átlagát, valamint a levelek számát.

3. feladat

Vedd elő újra a listás programot, egészítsd ki egy mindig a lista elejére beszúró függvénnyel.
Építs ezzel egy pár elemű listát, de ne véletlen értékekkel. Írd ki a listát. Mit tapasztalsz?

Az órai feladatok mintamegoldása

1. feladat
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct _lista {
    int d;
    struct _lista* n;
} lista;

void listabeszur(lista**, int);
void listakiir(lista*);
void listatorol(lista*);

int elemszam(const lista* plist) {
    int db = 0;
    for (; plist != NULL; plist = plist->n)
        db++;
    return db;
}

double elemosszeg(const lista* plist) {
    double sum = 0;
    for (; plist != NULL; plist = plist->n)
        sum += plist->d;
    return sum;
}

int main()
{
    int i;
    lista* head = NULL;
    srand(time(0));
    for (i = 0; i < 20; ++i)
        listabeszur(&head, rand());
    listakiir(head);
    listabeszur(&head, 8888);
    listakiir(head);

    printf("Atlag = %g\n", elemosszeg(head) / elemszam(head));


    listatorol(head);
    head = NULL;
    return 0;
}

void listabeszur(lista** h, int v)
{
    lista* curr, * prev, * newe;
    curr = prev = *h;
    newe = (lista*)malloc(sizeof(lista));
    newe->d = v;
    while (curr != NULL && curr->d < v) {
        prev = curr;
        curr = curr->n;
    }
    newe->n = curr;
    if (curr == prev)
        * h = newe;
    else
        prev->n = newe;
}

void listakiir(lista* h)
{
    while (h != NULL) {
        printf("%d\t", h->d);
        h = h->n;
    }
    printf("\n");
}

void listatorol(lista* h)
{
    lista* tmp;
    while (h != NULL) {
        tmp = h;
        h = h->n;
        free(tmp);
    }
}

 

2. feladat
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct _bifa {
    int d;
    struct _bifa* b, * j;
} bifa;

void fabeszur(bifa**, int);
void fakiir(bifa*);
void fatorol(bifa*);
int famelyseg(bifa*);

int elemszam(const bifa* pfa) {
    if (pfa == NULL)
        return 0;
    return elemszam(pfa->b) + elemszam(pfa->j) + 1;
}

double elemosszeg(const bifa* pfa) {
    if (pfa == NULL)
        return 0;
    return elemosszeg(pfa->b) + elemosszeg(pfa->j) + pfa->d;
}

int levelszam(const bifa* pfa) {
    if (pfa == NULL)
        return 0;
    return (pfa->b == NULL && pfa->j == NULL) ? 1 : (levelszam(pfa->b) + levelszam(pfa->j));
}

int main()
{
    int i;
    bifa* root = NULL;
    srand(time(0));
    for (i = 0; i < 200; ++i)
        fabeszur(&root, rand());
    printf("A fa melysege %d\n", famelyseg(root));
    fakiir(root);

    printf("\n\nAtlag = %g\n", elemosszeg(root) / elemszam(root));
    printf("Levelszam = %d\n", levelszam(root));

    fatorol(root);
    root = NULL;
    return 0;
}

void fabeszur(bifa** r, int v)
{
    if (*r != NULL) {
        if (v < (*r)->d)
            fabeszur(&((*r)->b), v);
        else if (v > (*r)->d)
            fabeszur(&((*r)->j), v);
        else
            ; /* nincs duplikalt elem */
    }
    else {
        *r = (bifa*)malloc(sizeof(bifa));
        (*r)->d = v;
        (*r)->b = (*r)->j = NULL;
    }
}

void fakiir(bifa* r)
{
    if (r == NULL) return;
    fakiir(r->b);
    printf("%d\t", r->d);
    fakiir(r->j);
}

void fatorol(bifa* r)
{
    if (r == NULL) return;
    fatorol(r->b);
    fatorol(r->j);
    free(r);
}

int famelyseg(bifa* r)
{
    int a, b;
    if (r == NULL) return 0;
    a = famelyseg(r->b);
    b = famelyseg(r->j);
    return 1 + (a < b ? b : a);
}

 

3. feladat
#include <stdio.h>
#include <stdlib.h>

typedef struct _lista {
    int d;
    struct _lista* n;
} lista;

void listakiir(lista*);
void listatorol(lista*);

void elejeretesz(lista** plista, int szam){
    lista* uj = (lista*)malloc(sizeof(lista));
    uj->d = szam;
    uj->n = *plista;
    *plista = uj;
}

int main()
{
    int i;
    lista* head = NULL;
    for (i = 0; i < 20; ++i)
        elejeretesz(&head, i);

    listakiir(head);

    listatorol(head);
    head = NULL;
    return 0;
}

void listakiir(lista* h)
{
    while (h != NULL) {
        printf("%d\n", h->d);
        h = h->n;
    }
    printf("\n");
}

void listatorol(lista* h)
{
    lista* tmp;
    while (h != NULL) {
        tmp = h;
        h = h->n;
        free(tmp);
    }
}