1. Feladat: Olvasson be változó számú neveket és érdemjegyeket egy struktúrába és írassa ki az eredményt.

#include<stdio.h>  // printf() és scanf() miatt kell
#include<stdlib.h> // malloc() miatt kell

struct Kurzus
{
    char nev[30];
    int jegy;
};

int main()
{
    struct Kurzus *ptr;
    int i, db;
    printf("Hany hallgato van? ");
    scanf("%d", &db);

    ptr = (struct Kurzus*) malloc (db * sizeof(struct Kurzus));

    for(i = 0; i < db; ++i)
    {
        printf("Kerem a nevet es a jegyet:\n");
        scanf("%s %d", (ptr + i)->nev, &ptr[i].jegy);
    }

    printf("Osszesen:\n");
    for(i = 0; i < db ; ++i)
    {
        printf("%s\t%d\n", ptr[i].nev, (ptr + i)->jegy);        
    }
}

2. Feladat: Láncolt lista: készítsünk egy int szam-ot tartalmazó struktúrát, ami tartalmaz egy mutatót egy önmagával megegyező típusra next néven.

#include <stdio.h>
struct Elem
{
    int szam;
    struct Elem *next;
};

int main()
{

}

3. Feladat: Láncolt lista: az előzőből hozzunk éltre két darabot dinamikusan, az első a másodikra mutasson.

#include <stdio.h>
#include <stdlib.h>
struct Elem
{
    int szam;
    struct Elem *next;
};

int main()
{
    struct Elem* e1 = (struct Elem*) malloc(sizeof(struct Elem));
    struct Elem* e2 = (struct Elem*) malloc(sizeof(struct Elem));
    // osszekotes első variacio
    e1->next = &e2[0];
    // osszekotes 2. variacio
    e1[0].next = e2;
}

4. Feladat: Láncolt lista: Készítsünk egy függvényt, ami kiírja a lista összes elemét. Majd kérjünk be a felhasználótól tetszőleges számú dinamikusan létrehozott listaelemet.

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

typedef struct Elem  // azért lett typedef, hogy kényelmes függvényparaméter lehessen
{
    int szam;
    struct Elem *next;  // a 'struct Elem' nem mas mint onmaga
} Elem;

void printList(Elem * head)
{
    Elem * current = head;

    while (current != NULL)
    {
        printf("%d\n", current->szam);
        current = current->next;
    }
}

int main()
{
    int db;
    printf("Hany elemet ad meg?");
    scanf("%d", &db);

    Elem *last = NULL;
    Elem *first = NULL;
    for(int i=0; i < db; i++)
    {
        Elem* e = (Elem*) malloc(sizeof(Elem));
        e->next = NULL;  // probaljuk ki úgy is, hogy ezt a sort kitoroljuk. Magyarazzuk meg miert tortenik?
        if(last != NULL) // ha nem az elsőt töltjük fel
        {
            last->next = e;
        }
        else // ha az elsőt töltjük fel, az elsőt eltároljuk, mert e nélkül elveszne az első eleme a listának
        {
            first = e;
        }
        printf("Kerem az %d.-t:", i);
        scanf("%d", &e->szam);
        last = e; // osszekotjuk a ket strukturat
    }
    printList(first);
}

5. Feladat: Értsük meg jobban a typedef használatát a _types.h kódrészlete alapján:

/* sys/x86/include/_types.h in FreeBSD */
/* this is machine dependent */
#ifdef  __LP64__
typedef unsigned long       __uint64_t;
#else
__extension__
typedef unsigned long long  __uint64_t;
#endif
...
...
typedef __uint64_t  __size_t;   

A fenti kódpélda az unsigned long long ot rövidíti __size_t-nek (64 bites rendszereken). A következő kódrészlet 3 féle struktúradefiníciót alkalmaz:

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

/* uj tipust hozunk létre Item neven.
   A struct elem_t helyett Item-et irhatunk kesobb
*/
typedef struct elem_t
{
    char *text;
    int count;
    struct elem_t *next; /* itt meg nem lehet roviditeni */
} Item;

/* normal struktura definicio */
struct item
{
    char *text;
    int count;
    struct item *next;
};

/*
* ez valojaban egy nevtelen struktura
*/
struct
{
    int i;
    char c;
} nevtelen;

int main(void)
{
    // mutato a "struct item"-re
    struct item *pi = (struct item *)malloc(sizeof(struct item));;
    pi->count = 10;

    // Roviditett hasznalata a "struct item_t"-nek
    Item *iI = (Item *)malloc(sizeof(Item));
    iI->count = 5;
    iI->next = iI; // onmagara mutat (csak a pelda kedveert)

    // nevtelen structura
    nevtelen.i = 9;
    nevtelen.c = 'x';
}

6. Feladat: A 4. példához készítsünk egy Elem* pop() függvényt, ami az első elemet eltávolítja a listából

Elem* pop(Elem *first)
{
    Elem *ret = first->next;
    free(first);
    return ret;
}

7. Feladat: A 4. példához készítsünk egy void sort(Elem*), ami sorbarendezi növekvő sorrendbe a lista elemeit, az értékek módosításával.

void sort(Elem *first)
{
    Elem *e1, *e2;
    e1 = first;
    while(e1->next != NULL)
    {
        e2 = e1->next;
        while(e2 != NULL)
        {
            if(e2->szam < e1->szam)
            {
                int tmp = e2->szam;
                e2->szam = e1->szam;
                e1->szam = tmp;
            }
            e2 = e2->next;
        }
        e1 = e1->next;
    }
}