Д) Удаление и вставка в массивах

Задача 11. Удалить из массива второй по счету элемент.

 

Поскольку полное количество элементов в массиве задано в его объявлении, физически "удалить" элемент из массива невозможно. Но с практической точки зрения, "удалить" элемент можно путем "сдвига" всех следующих за ним элементов "влево" (т.е. на предыдущую позицию, с меньшим на 1 индексом) и уменьшения на 1 количества используемых элементов:

 

1

 

 

Здесь используемые элементы выделены жирным цветом, а неиспользуемые - бледным.

Фрагмент программы имеет вид:

 

for (i=2; i<n; i++)

a[i-1]=a[i];

n--;

 

Задача 12. Удалить из массива элементы, большие 10.

 

В этой задаче требуется удалить заранее неизвестное количество элементов; поэтому неясно, на сколькр позиций нужно производить сдвиг. Потому лучше просто ввести две разные переменные: индекс элемента "до сдвига" и его индекс "после".

Сдвинуть нужно все неудаляемые элементы. Их количество и будет новым числом используемых элементов массива.

Индекс "до сдвига", очевидно, принимает все значения от 0 до n-1. А индекс "после" увеличивается на 1 после каждой записи очередного элемента:

for (k=i=0; i<n; i++)

if (a[i]<=10) a[k++]=a[i];

n=k;

 

Задача 13. Вставить в массив число 5 на вторую по счету позицию.

 

Подобно удалению, "вставка элемента" по сути означает "сдвиг" части элементов массива "вправо" (т.е. на последующие позиции, с большими индексами) и помещение вставляемого числа на освободившуюся позицию. При этом число используемых элементов возрастает.

При программировании этого алгоритма нужно быть осторожным, чтобы не испортить последующие элементы массива раньше, чем они будут сдвинуты. Например, следующая программа:

 

for (i=0; i<n; i++)

a[i+1]=a[i];

n++;

 

заполнит все n элементов массива одним и тем же значением, равным первоначальному значению a[0]. Действительно, при первой итерации цикла i=0, и будет выполнено a[1]=a[0]. При второй итерации будет a[2]=a[1] (а значение a[1] уже равно a[0] ) и т.д.

Одним из выходов является использование второго массива:

 

b[0]=a[0];

b[1]=5;

for (i=1; i<n; i++)

b[i+1]=a[i];

n++;

for (i=0; i<n; i++)

a[i]=b[i];

 

 

Другой способ - изменить порядок сдвига:

 

for(i=n; i>1; i--)

a[i]=a[i-1];

a[1]=5;

n++;