#include <stdio.h>

/** \brief Ein Listenelement einer einfach verketetten Liste. */
struct list_element {
  struct list_element *next;	/*!< Zeigen auf den Nachfolger in der Liste */
  int value;			/*!< Der Wert der in einem Listenelement gespeichert wird. In diesem Beispiel ein int.*/
};

/** \brief Ein Listenkopf zu verwalten einer einfach verketetten Liste. */
struct list_head {
  struct list_element *front;	/*!< Zeiger auf das erste Element der Liste. */
  struct list_element *end;	/*!< Zeiger auf das letzte Element der Liste. */
};



struct list_head* list_new() {
    return malloc(sizeof(struct list_head));
}

struct list_element* list_push(struct list_head* head) {
    
    //List head is null
    if(!head) {
        return NULL;
    }
    
    //Initialize list element
    
    struct list_element* elm = malloc(sizeof(struct list_element));
    
    if(elm == NULL) {
        //Couldn't alloc memory
        return NULL;
    }
    
    if(!(head->front)) {
        head->front = elm;
        head->end = elm;
    } else {
        //List head is not null, set next elm to point to current elm
        elm -> next = head -> front;
        head->front = elm;

    }
    
    return elm;
}

int print_list(struct list_head* head) {
    printf("Liste: ");
    if(head == NULL || head->front == NULL) {
        printf("ist leer \n");
        return 0;
    }
    
    struct list_element *elm = head-> front;
    int numberOfElements = 0;
    
    while(elm) {
        printf("%i", elm -> value);
        printf(" ");
        elm = elm -> next;
        numberOfElements++;
    }
    printf("\n");
    return numberOfElements;
}



int main(void) {
	struct list_head listHead = *list_new();
	
	//First item
	  struct list_element *element1 = list_push(&listHead);
    element1 -> value = 20;
    
    //Second item
      struct list_element *element2 = list_push(&listHead);
    element2 -> value = 10;
    
    //List is now 10 20
   
    print_list(&listHead);

}
