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

typedef struct item{
    double data;
    struct item *next;
} ITEM,*P_ITEM;

//void add(double data, P_ITEM seznam){
struct item* add(double data, struct item* seznam){
    struct item *novy = (struct item*) malloc(sizeof(struct item));
    novy->data=data;
    novy->next=seznam;// <==> (*novy).next=seznam;
    return novy;
}

void add2(double data, struct item** seznam){
    struct item *novy = (struct item*) malloc(sizeof(struct item));
    novy->data=data;
    novy->next=*seznam;
    (*seznam)=novy;

}

//void print(P_ITEM seznam){
void print(struct item *seznam){
    struct item *ukaz;
    ukaz=seznam;
    while (ukaz!=NULL){
        printf("%f\n",ukaz->data);
        ukaz=ukaz->next;
    }
}
void free_list(P_ITEM seznam){
    struct item* kezruseni;
    while (seznam!=NULL){
        kezruseni=seznam;
        seznam=seznam->next;
        free(kezruseni);
    }
}

void free_list_rek(P_ITEM seznam){
    while(seznam!=NULL){
        free_list_rek(seznam->next);
        free(seznam);
    }
}
struct item* add_na_konec(double data, struct item* seznam){
    //vkladam prvni prvek
    if (seznam==NULL){
    struct item *novy = (struct item*) malloc(sizeof(struct item));
    novy->data=data;
    novy->next=seznam;// <==> (*novy).next=seznam;
    return novy;
    }
    //vkladam 2 a dalsi prvek
    struct item *ukaz;
    ukaz=seznam;
    while (ukaz->next!=NULL){       
        ukaz=ukaz->next;
    }
    //ukaz je nestaveno na poslednim prvku
    struct item *novy = (struct item*) malloc(sizeof(struct item));
    novy->data=data;
    novy->next=NULL;
    ukaz->next=novy;
    return seznam;
}

int main(int argc, char *argv[])
{
    struct item *seznam1=NULL;
    /*
    seznam1=add_na_konec(1.1,seznam1);
    seznam1=add_na_konec(10.5,seznam1);
    seznam1=add_na_konec(50.5,seznam1);
    */
    add2(1.1,&seznam1);
    add2(10.5,&seznam1);
    add2(50.5,&seznam1);
    print(seznam1);
    free_list(seznam1);
    return 0;
}