Лічильник
Сьогодні Разом
Відвідувань 36 5273710
Авторізацій 0 423086
Користувачів 0 2728
Статья

27. Удаление элемента массива


Путь задан массив на n элементов. Необходимо удалить третий его элемент.

Удалить элемент - это означает, что все элементы идущие за удаляемым элементом должны быть сдвинуты на один влево. Следовательно удаление элемента массива - это сдвиг элементов на один влево, начиная с элемента, идущего за удаляемым:
 n := n - 1;
 for i := 3 to n do
   a[i] := a[i + 1];
В этом примере мы удалили третий элемент массива, но что мешает вместо фиксированного значения "3" указать произвольный элемент массива, например индекс которого хранится в переменной k?
 n := n - 1;
 for i := k to n do
   a[i] := a[i + 1];
PS: В действительности количество элементов массива не изменилось, так как в Pascal массивы статичны, и их длина определяется на этапе объявления. Но число "живых" элементов массива изменилось и оно определяется значением переменной n.

28. Удалить первый нулевой элемент массива


Сведем эту задачу к предыдущей: удалим k-й элемент массива, это мы уже умеем. Но для этого надо знать k - индекс первого нулевого элемента массива. В принципе на уроке по циклам while мы уже рассматривали такой алгоритм, напомним его: Начинаем с первого элемента массива, просматриваем массив, пока не встретим нулевой элемент массива или не дойдем до конца массива, так и не найдя нулевой элемент:
 k := 1;
 while (k <= n) and (a[k] <> 0) do
   k := k + 1;
Итак, переменная k содержит индекс первого нулевого элемента массива, если он существует, или на единицу больше, чем значение переменной n. Это означает, что в массиве нет нулевого элемента (, а значит и удалять ничего не нужно).
 if (k <= n)
   then begin
          // Удалить k-й элемент массива
        end
Объединим в единое целое получим:
 k := 1;
 while (k <= n) and (a[k] <> 0) do
   k := k + 1;
 if (k <= n)
   then begin
          n := n - 1;
          for i := k do n do
            a[i] := a[i + 1]
        end
И так, первый нулевой элемент массива удален. А как быть, если надо удалить все нулевые элементы массива?

29. Удаление всех нулевых элементов массива


Собственно говоря и эту задачу можно свести к предыдущей. Сформулируем алгоритм так: Начиная с первого элемента будем просматривать массив, и как только текущий элемент равен нулю - удалим его, после чего продолжим просмотр элементов дальше.
k := 1;
while k <= n do
  if a[k] = 0
    then begin
           // Удалить k-й элемент массива
         end
    else k := k + 1
В этом алгоритме важно учесть, что переход к следующему элементу массива (k := k + 1) необходим только в случае, если текущий элемент не нулевой и его удалять не нужно.

Не сложно обратить внимание, что алгоритм удаления всех нулевых элементов массива можно несколько улучшить, если просматривать массив будем не в прямом, а обратном порядке. Это объясняется тем, что мы не будем перемещать элементы, которые в последствии будут удалены.
k := n;
while k >= 1 do begin
  if a[k] = 0
   then begin
          // Удалить k-й элемент массива
        end;
  k := k - 1
end;
В этом алгоритме переход к предыдущему элементу массива осуществляем не зависимо от того, удаляем ли мы его или нет.

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