Вставка элемента после элемента
С заданным номером
Пример
Вставить число 100 после пятого элемента массива.
Решение
Пусть k − номер элемента, после которого мы должны вставить элемент х (k и х будем вводить с клавиатуры). Вставка осуществляется следующим образом:
¨ первые k элементов массива остаются без изменений;
¨ все элементы, начиная с (k+1)−го необходимо сдвинуть вправо;
¨ элементу с номером (k+1) присваиваем значение х.
Рассмотрим конкретный пример. Пусть дан следующий одномерный массив из N (N=10) элементов:
3, -12, 5, 14, 27, -6, 1, -34, 10, -15.
Надо вставить элемент со значением 100 после пятого элемента массива. Мы получим следующий массив:
3, -12, 5, 14, 27, 100, -6, 1, -34, 10, -15.
Таким образом, после вставки в массиве станет 11 элементов, и это надо учесть при описании типа myarray:
Type myarray=Array[1..n+1] Of Integer;
Будем выводить массив два раза − до и после вставки нового элемента, используя уже известную процедуру Print1.
Составим теперь основную программу с использованием новой процедуры Insert1(k1, x1, m), которой передаются: k1 − номер элемента, после которого надо вставить новый элемент, x1 − значение нового элемента, m − массив. Сдвиг элементов будем начинать с конца массива.
Program Example_105;
Const n=10; dd=51;
Type myarray=Array[1..n+1] Of Integer;
Var A: myarray;
x, k: Integer;
{x - значение нового элемента, k - номер
элемента,после которого вставляем}
Procedure Init2(Var m: myarray);
{Процедура заполнения (инициализации)
массива случайными числами}
...
Procedure Print1(n1: Integer; m: myarray);
{Процедура вывода (распечатки) массива}
...
Procedure Insert1(k1, x1: Integer;
Var m: myarray);
Var i: Integer;
Begin
{Сдвиг элементов на одну позицию назад}
For i:=n Downto k1+1 Do m[i+1]:=m[i];
m[k1+1]:=x1;
{Вставка элемента после k1-го}
End;
Begin
Init2(А);
Print1(n, А); {Вывод начального массива
из n элементов}
Writeln('Номер элемента, после которого
вставлять, ');
Writeln('и значение нового элемента');
Readln(k, x);
Insert1(k, x, A);
Print1(n+1,A);{Вывод массива после вставки нового элемента}
Readln;
End.
Вставка элемента перед элементом с
Данным номером
Пример
Вставить число 100 перед пятым элементом массива.
Решение
Эта задача немного отличается от предыдущей: в предыдущей мы сдвигали вправо все элементы, стоящие после k−го, то есть с (k+1)−го, а на его место записывали новый элемент, в этой − сдвигаем все элементы с k−го, а затем на его место записываем новый.
Пусть дан следующий одномерный массив из N (N=10) элементов:
3, -12, 5, 14, 27, -6, 1, 34, 10, -15.
Надо вставить элемент со значением 100 перед пятым элементом массива. Получим следующий массив:
3, -12, 5, 14, 100, 27, -6, 1, 34, 10, -15.
Program Example_106;
Const n=10; dd=51;
Type myarray=Array[1..n+1] Of Integer;
VarA: myarray;
x, k: Integer;
{x - значение нового элемента, k - номер элемента, после которого вставляем}
Procedure Init2(Var m:myarray);
{Процедура заполнения (инициализации)
массива случайными числами}
...
Procedure Print1(n1: Integer; m: myarray);
{Процедура вывода (распечатки) массива}
...
Procedure Insert2(k1, x1: Integer;
Var m: myarray);
Var i: Integer;
Begin{Сдвиг на одну позицию вправо}
For i:=n Downto k1 Do m[i+1]:=m[i];
m[k1]:=x1; {Вставка x1 на место элемента
с номером k1}
End;
Begin
Init2(А);
Print1(n,А); {вывод начального массива}
Writeln('Номер элемента, перед которым
вставлять, ');
Writeln('и значение нового элемента');
Readln(k,x);
Insert2(k, x, A);
Print1(n+1, A); {Вывод массива после
вставки нового элемента}
Readln;
End.
Вставка нескольких элементов
Предположим, что необходимо вставлять не один элемент, а по одному элементу после всех элементов с заданным свойством.
Пример
Вставить данное число после всех элементов массива, кратных 3.
Решение
Первое, на что необходимо обратить внимание, - это описание массива: на сколько элементов может увеличиться массив? Максимальное количество элементов, после которых будет вставлен новый элемент, совпадает с количеством элементов массива, ведь может случиться так, что все элементы массива обладают заданным свойством. Поэтому массив может увеличиться максимум в два раза, а значит, соответствующее описание будет следующим:
Type myarray=Array[1..2*n] Of Integer;
Если мы будем просматривать элементы массива с начала и вставлять новый элемент после элемента с заданным свойством, то номер последнего элемента каждый раз будет меняться, кроме того, придется пропускать ("перепрыгивать") новый (вставленный) элемент, поэтому решение будет не очень эффективным.
Удобнее просматривать массив с конца, тогда вставляемый элемент мешать не будет.
Составим программу.
Program Example_107;
Const n=10; dd=51;
Type myarray=Array[1..2*n] Of Integer;
Var A: myarray;
x, k, i: Integer;
{x - значение нового элемента,
k - счетчик вставленных элементов}
Procedure Init2 (Var m:myarray);
{Процедура заполнения (инициализации)
массива случайными числами}
...
Procedure Print1 (n1: Integer; m: myarray);
{Процедура вывода (распечатки) массива}
...
Procedure Insert3 (k1, x1: Integer;
Var m: myarray);
Var i: Integer;
Begin
{Сдвиг элементов на n+k - это в данный
номер последнего элемента}
For i:=n+k Downto k1+1 Do
m[i+1]:=m[i];
m[k1+1]:=x1;
{Вставка элемента на место - после k1-го}
Inc(k); {Увеличение счетчика вставленных
элементов}
End;
Begin
Init2(А);
Print1(n, A);
Writeln('Введите вставляемое число');
Readln(x);
k:=0;
For i:=n Downto 1 Do
If A[i] Mod 3=0 Then Insert3(i, x, A);
Print1(n+k,A); {Вывод массива после
вставки в него всех элементов}
Readln;
End.
Перестановки элементов массива