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

#define MAX_ELEMENTS    10
#define EMPTY_ELEMVAL   0

#define ARR_ISEMPTY(arr)        ( (arr)[0] == EMPTY_ELEMVAL )//εάν το πρώτο τμήμα του arr είναι 0 τότε επέστρεψε 0 αλλιώς 1
#define ARR_ISFULL(arr, maxlen)    ( (arr)[(maxlen)-1] != EMPTY_ELEMVAL )//εάν το τελευταίο τμήμα του arr είναι γεμάτο τότε επέστρεψε 0 αλλιώς 1

typedef struct {
    int     len;
    int     arr[ MAX_ELEMENTS] ;
} List;

    // -----------------------------------------------------------------------------
void list_reset( List *list, int maxelems)
{
    register int i;

    for (i=0; i<maxelems; i++)//ενώ το i είναι μικρότερο των ορίων του maxelems
        list->arr[i] = EMPTY_ELEMVAL;//το arr[i] γίνεται 0
    list->len = 0;//το length του list γίνεται 0

    return;
}
    // -------------------------------------------------------------------------------------
int list_append( List *list, int maxelems, int val)
{
       if ( ARR_ISFULL( list->arr, maxelems ) )//εάν είναι γεμάτο το arr
               return -1;

        if ( ARR_ISEMPTY( list->arr ) ) {      //εάν είναι άδειο το arr
               list->arr[0] = val;             //το val εκχωρείται στο arr[0]
               list->len = 1;                  //το μήκος του arr γίνεται 1
               return 0;
        }

        register int i;
        for (i=maxelems-1; list->arr[i] == EMPTY_ELEMVAL; i--)//ενώ(ι=μήκος-1;το arr[i] είναι 0; i--)
                ;
        list->arr[++i] = val;//το arr[i+1] = val
        (list->len)++;       //το μήκος αυξάνεται κατά 1

        return i;
}
    // -------------------------------------------------------------------------------------
void list_print( List list, int maxelems )
{
        register int i;

        for (i=0; i < maxelems; i++)            //ενώ(i εισούται με 0;i είναι μικρότερο του maxlems;i++)
               printf("%d ", list.arr[i] );     //εκτύπωσε το iοστό του arr
       putchar('\n');//εκτύπωσε '\n'
        return;
}
    // -----------------------------------------------------------------------------
int main( void )
{
     List mylist;//δημιουργία ενός struct τύπου list με όνομα mylist

     list_reset( &mylist, MAX_ELEMENTS);
     list_append( &mylist, MAX_ELEMENTS, 999);
     list_print( mylist, MAX_ELEMENTS );

     return 0;
}