Преобразовать одномерный массив, увеличив каждую его серию на 1 элемент - C (СИ)
Формулировка задачи:
Подскажите,пожалуйста, как написать эту программу.
Дан целочисленный массив размера N. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии-количество этих элементов(длина может=1). Преобразовать массив,увеличив каждую его серию на 1 элемент.
Решение задачи: «Преобразовать одномерный массив, увеличив каждую его серию на 1 элемент»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void PrintArray(const int* const array, const int arrayLength)
{
int i = 0;
printf("----- Array[length = %d]: -----\n", arrayLength);
for(i = 0; i < arrayLength; i++)
{
printf("%d ", array[i]);
}
printf("%c", '\n');
}
void FillArray(int** const ptrToArray, const int maxLength)
{
int i = 0;
(*ptrToArray) = malloc(maxLength * sizeof(**ptrToArray));
for(i = 0; i < maxLength; i++)
{
(*ptrToArray)[i] = rand() % 10;
}
}
void ProcessArray(int** const ptrToArray, int* const ptrToArrayLength)
{
int* tempArray = NULL;
int i = 0;
int j = 0;
int oldLength = 0;
int newLength = 0;
oldLength = (*ptrToArrayLength);
newLength = oldLength;
/* counting sequences */
for(i = 0; i < oldLength - 1; i++)
{
if ((*ptrToArray)[i] != (*ptrToArray)[i + 1])
{
newLength++;
}
}
newLength++; /* last element will be duplicated either way */
tempArray = malloc(newLength * sizeof(*tempArray));
i = 0;
j = 0;
while (i < oldLength - 1)
{
tempArray[j] = (*ptrToArray)[i];
if ((*ptrToArray)[i] != (*ptrToArray)[i + 1])
{
tempArray[j + 1] = tempArray[j];
j = j + 2;
}
else
{
j++;
}
i++;
}
tempArray[newLength - 2] = (*ptrToArray)[oldLength - 1];
tempArray[newLength - 1] = tempArray[newLength - 2];
free(*ptrToArray);
(*ptrToArray) = tempArray;
(*ptrToArrayLength) = newLength;
}
void FreeArray(int** const ptrToArray)
{
free(*ptrToArray);
(*ptrToArray) = NULL;
}
int main(void)
{
int* a = NULL;
int N = 10;
srand(time(NULL));
FillArray(&a, N);
PrintArray(a, N);
ProcessArray(&a, &N);
PrintArray(a, N);
FreeArray(&a);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняются следующие действия:
- Создаются функции для работы с массивом:
PrintArray- выводит элементы массива на экран;FillArray- заполняет массив случайными числами;ProcessArray- обрабатывает массив, объединяя его серии;FreeArray- освобождает память, выделенную под массив.
- В функции
mainсоздается массивaдлинойN = 10, заполняется случайными числами с помощьюFillArrayи выводится на экран с помощьюPrintArray. - Затем вызывается функция
ProcessArray, которая обрабатывает массив, объединяя его серии. В результате обработки массив удлиняется на 1 элемент, и его последний элемент дублируется. - После обработки массив выводится на экран с помощью
PrintArray. - Вызывается функция
FreeArray, освобождающая память под массивом. - Программа завершается возвратом 0 из функции
main.