#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;
}