Вставка динамической переменной

Задача: 
  1. Построить цепочку динамической структуры (стек), содержащую целые числа.
  2. Затем между 4-й и 5-й динамической переменной вставить еще одну.
Описание переменных: 

ir – указатель на конец структуры;
ip – указатель на текущую резервируемую память;
insert4 – указатель на 4-ю переменную стека;
insert5 – указатель на 5-ю переменную стека;
inserti – указатель на динамическую переменную, вставляемую между 4-м и 5-м элементами стека;
k – счетчик;
l – записываемое или считываемое из стека число.

Алгоритм решения задачи: 

Сначала ir присваивается nil, т.е. указатель не указывает ни на какой участок памяти.

В цикле for происходит заполнение стека по следующему алгоритму. У пользователя запрашивается число, которое записывается в обычную переменную l. Резервируется участок памяти под указатель ip. В захваченный участок памяти записывается значение l и значение указателя ir (первый раз ir указывает на nil). Т.е. теперь ip указывает на nil. Переменная ir, в свою очередь, связывается с участком памяти, в который сейчас производилась запись. В итоге, после первой итерации получается структура, где первый элемент имеет указатель на nil, а переменная ir указывает на этот элемент. По окончании работы цикла for получается линейная динамическая структура данных стекового типа, где первый элемент указывает на nil, а последний элемент помечен (указан) переменной ir.

В цикле for помимо прочего, происходит связывание указателей insert4 и insert5 с четвертым и пятым элементами структуры соответственно. Когда происходит пятая итерация цикла (k = 5), то указатель-переменная ip хранит адрес пятого элемента, поэтому ее значение присваивается insert5. В следующей итерации цикла ip изменится, а в указателе insert5 сохранится адрес пятого элемента. В пятом элементе хранится адрес на четвертый элемент, который записывается в переменную insert4.

Вставка нового элемента структуры между 4-й и 5-й динамическими переменными происходит так. У пользователя запрашивается число, которое записывается в переменную l. Резервируется участок памяти, адрес которого помещается в указатель inserti. В содержательную часть этой области записывается значение l. Далее, в указывающую часть этой области записывается ссылка на четвертый элемент структуры (его адрес хранится в переменной insert4). Пятый элемент стека, уже не должен ссылаться на четвертый, он должен указывать на элемент, который указан переменной inserti.

Для вывода элементов стека на экран также используется цикл for. Обход стека возможен только с его конца. На конец стека указывает переменная ir, значение которой присваивается ip. Далее из этого участка памяти извлекается число, записывается в l и выводится на экран. Указателю ir присваивается значение указывающей части ip, т.е. ir теперь указывает на следующий элемент (правильней сказать, предыдущий элемент стека).

Программа на языке Паскаль: 

type
    intp = ^intrec;
    intrec = record
        i: integer;
        p: intp
    end;
 
var
    ip, ir, inserti, insert4, insert5: intp;
    k, l: integer;
 
begin
    ir := nil;
 
    writeln('Введите 10 чисел.');
    for k := 1 to 10 do begin
        readln(l);
        new(ip);
        ip^.i := l;
        ip^.p := ir;
        ir := ip;
        if k = 5 then begin
            insert5 := ip;
            insert4 := ip^.p
        end
    end;
    writeln;
 
    writeln('Введите еще одно число.');
    readln(l);
    new(inserti);
    inserti^.i := l;
    inserti^.p := insert4;
    insert5^.p := inserti;
 
    for k := 1 to 11 do begin
        ip := ir;
        l := ip^.i;
        write(' ',l);
        ir := ip^.p;
        dispose(ip)
    end;
 
readln
end.

Примечания: 

Программа запрашивает 10 чисел, которые вводятся в столбик. Если ввести числа 1 2 3 4 5 6 7 8 9 10, а затем добавить число 25, то программа выдаст такую строку:
10 9 8 7 6 5 25 4 3 2 1.

Комментарии

Помогите,пожалуйста

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