Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
03.03.2016
Размер:
2.87 Mб
Скачать

Удаление элементов из массива

Чтобы удалить элемент из массива , необходимо сдвинуть элементы на один "шаг" влево и уменьшить значение на 1. Если , то в этом случае достаточно выполнить .

Пример 1. Из массива Х удалить минимальный элемент.

#define NMAX 20

int main()

{

double Xmin, x[NMAX];

int n,i,imin;

//ВВод n и массива x

Xmin=x[0]; imin=0; // Определение положения

for (i=1; i<n; i++) // (индекса) минимального

if (x[i]<Xmin) // элемента

{ Xmin=x[i]; imin=i; }

for (i=imin; i<n-1; i++) // Удаление элемента

x[i]=x[i+1]; // с индексом imin

n--; // Уменьшение размера массива

//Печать массива x

getch();

return 0;

}

Если imin = n-1, то второй цикл for не работает (не выполняется условие входа в цикл), но размер массива n уменьшается на 1.

Пример 2. Из массива Х удалить все нулевые элементы.

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

Вариант 1.

#define NMAX 20

int main()

{

double x[NMAX];

int n=20,i,j;

//ВВод n и массива x

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

if (x[i]==0)

{

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n--; // Уменьшение размера массива

}

//Печать массива x

getch();

return 0;

}

По поводу программы вариант 1 можно сделать два замечания.

1. При i = n-1, когда анализируется последний элемент массива, параметр j принимает значение n-1, т.е. начальное значение параметра цикла не соответствует условию входа в цикл j<n-1. Оператор for в этом случае не выполняется, т.е. оператор цикла эквивалентен пустому оператору. Следовательно, при происходит лишь уменьшение значения n, что соответствует алгоритму решения задачи.

2. Предположим, что в массиве X имеются подряд идущие нулевые элементы и . При i = k будет удален элемент , а на его место перемещается элемент , также равный нулю. Поскольку при новом повторении цикла for параметр цикла принимает очередное значение k+1, то новый нулевой элемент не будет анализироваться повторно и, как следствие, не будет удален из массива. Поэтому при наличии в массиве подряд идущих нулевых элементов программа варианта 1 работает неправильно.

Для корректного решения поставленной задачи нужно, чтобы программа после удаления нулевого элемента повторно анализировала этот же элемент и переходила к рассмотрению элемента лишь при  0. Для этого нужно в программе вместо цикла for использовать цикл while:

Вариант 2 (фрагмент).

//Ввод n и массива x

i=0;

while ( i<n)

if (x[i]==0)

{

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n--; // Уменьшение размера массива

}

else i++;

//Печать массива x

Тот же эффект можно достичь с помощью оператора for, если просмотр массива выполнять справа налево.

Вариант 3 (фрагмент).

//ВВод n и массива x

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

if (x[i]==0)

{

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n--; // Уменьшение размера массива

}

//Печать массива x

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

Рассмотрим еще один вариант программы, предназначенной для удаления нулевых элементов из массива. В этом случае все ненулевые элементы переносятся в начало массива. Для этого в переменную j перед началом цикла заносится -1. Если был найден ненулевой элемент массива, значение увеличивается на 1, и найденный элемент массива переписывается на место j-го элемента, если j!=i. Таким образом, в j находится номер последнего ненулевого элемента, перенесенного в начало массива. После цикла устанавливается новая длина массива n=j+1.

Вариант 4 (фрагмент).

//ВВод n и массива x

j=-1;

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

if (x[i]!=0)

{

j++;

if (j!=i) x[j]=x[i];

}

n=j+1;

//Печать массива x

В 4-м варианте перемещается лишь один элемент массива (и то не в каждом цикле), в то время как в предыдущих вариантах при удалении каждого элемента, кроме последнего, передвигается вся правая часть массива, причем чем ближе удаляемый элемент к началу массива, тем больше элементов перемещается справа налево. Этот способ является наиболее эффективным.

Соседние файлы в папке Прогр_обменка