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

#define MAX_ELEMENTS	10				// μέγιστο πλήθος στοιχείων
#define EMPTY_ELEMVAL	0				// τιμή κενών στοιχείων

							// έλεγχος για κενό πίνακα
#define ARR_ISEMPTY(arr)	( (arr)[0] == EMPTY_ELEMVAL )
							// έλεγχος για γεμάτο πίνακα
#define ARR_ISFULL(arr, len)	( (arr)[(len)-1] != EMPTY_ELEMVAL )

typedef enum { FALSE=0, TRUE } Bool;			// ο δικός μας τύπος boolean

// -------------------------------------------------------------------------------------
// Εκτύπωση όλων των στοιχείων του πίνακα
//
void arr_print( int arr[], int maxelems )
{
	register int i;

	for (i=0; i < maxelems; i++)			// διέτρεξε όλο τον πίνακα
		printf("%d ", arr[i]);			// τυπώνοντας τα στοιχεία του
	putchar('\n');					// αλλαγή γραμμής στην οθόνη

	return;
}
// -------------------------------------------------------------------------------------
// Εισαγωγή νέου στοιχείου με τιμή val στο τέλος του πίνακα arr (επιστρέφει τη θέση στην
// οποία εισήχθη το νέο στοιχειο, ή -1 σε περίπτωση που ο πίνακας ήταν ήδη γεμάτος)
//
int arr_append( int arr[], int maxelems, int val)
{
	if ( ARR_ISFULL(arr, maxelems) )		// σε γεμάτο πίνακα...
		return -1;				// επιστροφή αποτυχίας

	if ( ARR_ISEMPTY(arr) ) {			// σε κενό πίνακα...
		arr[0] = val;				// εισαγωγή στην αρχή
		return 0;				// επιστροφή 1ης θέσης
	}
	register int i;					// σε μη κενό πίνακα...
	for (i=maxelems-1; arr[i] == EMPTY_ELEMVAL; i--)// αναζήτηση πρώτου...
		;					// κενού στοιχείου
	arr[++i] = val;					// αντικατάστασή του...
							// με το νέο στοιχείο
	return i;					// επιστροφή θέσης εισαγωγής
}
// -------------------------------------------------------------------------------------
// Εισαγωγή νέου στοιχείου με τιμή val στην αρχή του πίνακα arr (επιστρέφει FALSE σε
// περίπτωση που ο πίνακας ήταν ήδη γεμάτος, αλλιώς TRUE)
//
Bool arr_prepend( int arr[], int maxelems, int val)
{
	if ( ARR_ISFULL(arr, maxelems) )		// σε γεμάτο πίνακα
		return FALSE;				// επιστροφή αποτυχίας

							// μετακίνηση των στοιχείων μια
							// θέση προς τα δεξιά, ξεκινώντας
	memmove( &arr[1], &arr[0], (maxelems-1) * sizeof(int) );// από το 1ο στοιχείο

	arr[0] = val;					// εισαγωγή νέου στοιχείου

	return TRUE;					// επιστροφή επιτυχίας
}
// -------------------------------------------------------------------------------------
// Αναζήτηση του στοιχείου με τιμή val στον πίνακα arr (επιστρέφει τη θέση στην οποία
// βρέθηκε το στοιχείο, αλλιώς επιστρέφει -1)
//
int arr_elemindex( int arr[], int maxelems, int val )
{
	register int i;
					// όσο τα στοιχεία του πίνακα διαφέρουν του val
	for (i=0; i < maxelems && arr[i] != val; i++)	// και υπάρχουν ακόμα στοιχεία
		;					// συνέχισε
	return i == maxelems ? -1 : i;	// τέλειωσαν τα στοιχεία ? -1 αλλιώς i		
}
// ------------------------------------------------------------------------------------
// Διαγραφή του στοιχείου με τιμή val από τον πίνακα arr (επιστρέφει FALSE αν το
// στοιχείο δεν βρέθηκε στον πίνακα, αλλιώς το διαγράφει κι επιστρέφει TRUE)
//
Bool arr_delete( int arr[], int maxelems, int val)
{
	register int i;

	int elem = arr_elemindex( arr, maxelems, val);	// εύρεση στοιχείου με τιμή val
	if ( elem == -1 )				// το στοιχείο δεν βρέθηκε...
		return FALSE;				// επιστροφή αποτυχίας

				// μετακίνηση των στοιχείων μια θέση προς τα αριστερά ...
				// ξεκινώντας από τη θέση που βρέθηκε το στοιχείο
	for (i=elem; arr[i+1] != EMPTY_ELEMVAL && i < maxelems-1; i++)
		arr[i] = arr[i+1];

	arr[i] = EMPTY_ELEMVAL;		// μηδενισμός του τέως τελευταίου στοιχείου 

	return TRUE;					// επιστροφή επιτυχίας
}
// -------------------------------------------------------------------------------------
int main( void )
{
	int arr[ MAX_ELEMENTS ] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

						// μηδενισμός όλων των στοιχείων του arr
//	memset(arr, 0, MAX_ELEMENTS * sizeof(int) );

	arr_print( arr, MAX_ELEMENTS );

	return 0;
}

