ime_2/Exercícios/04 ‒ Arrays/array.c

114 lines
2.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
void flushInput() {
int c;
if ((c = getchar()) != '\n' && c != EOF)
flushInput();
}
int *resizeArray(int *array, int *buffer) {
*buffer *= 2;
return realloc(array, *buffer * sizeof(int));
}
int *readInput(int *size, int *buffer) {
int i, value, *array = NULL;
*buffer = 1;
for (i = 0; scanf(" %d", &value); array[i++] = value)
if (i == *buffer - 1)
array = resizeArray(array, buffer);
flushInput();
*size = i;
return array;
}
void shift(int *array, int start, int end, int increment) {
if (start == end)
return;
array[start] = array[start + increment];
shift(array, start + increment, end, increment);
}
int pop(int **array, int index, int *size) {
int value;
if (index >= *size || index < 0)
return EOF;
value = (*array)[index];
if (index > *size - index)
shift(*array, index, *size - 1, 1);
else
shift((*array)++, index, 0, -1);
(*size)--;
return value;
}
int *insert(int value, int index, int *array, int *size, int *buffer) {
if (index > *size) {
printf("Invalid index: index not in range 0 to %d", *size);
} else {
if (*size == *buffer - 1)
array = resizeArray(array, buffer);
shift(array, (*size)++, index, -1);
array[index] = value;
}
return array;
}
int iteractiveRemoveZeroes(int *array, int size) {
int i, j;
for (i = j = 0; j < size; j++)
if (array[j] != 0)
array[i++] = array[j];
return i;
}
int removeZeroes(int *array, int size) {
int pivot;
if (size == 0)
return 0;
pivot = removeZeroes(array, --size);
if (array[size] != 0)
array[pivot++] = array[size];
return pivot;
}
void printArray(int *array, int size) {
int i;
for (i = 0; i < size; i++)
printf("%d ", array[i]);
printf("\n");
}
int main() {
int value, index, size, buffer, *array;
printf("This program tests the functionality of functions to insert and "
"remove content of an array. Type in a sequence of numbers ended "
"with \".\" and press enter: ");
array = readInput(&size, &buffer);
printf("Select an index to insert a value: ");
scanf(" %d", &index);
printf("Select a value to be inserted: ");
scanf(" %d", &value);
array = insert(value, index, array, &size, &buffer);
printf("Resulting array: ");
printArray(array, size);
printf("Select an index to remove a value: ");
scanf(" %d", &index);
printf("Value removed: %d\nResulting array:", pop(&array, index, &size));
printArray(array, size);
size = removeZeroes(array, size);
printf("With all null elements removed, the resulting array is:\n");
printArray(array, size);
return 0;
}