uses Crt; {см. Описание выше} const{см. Описание выше} MaxNum=30; {количество элементов списка} type{см. Описание выше} pEl= ^Element; {создаём тип pEl – указатель на запись Element, т.е. наш список} Element= record i. Data:integer; {поле записи, содержит данные об элементе} ii. Next:pEl; {указатель на сл. эл. списка} iii. Prev:pEl {указатель на пред. эл. списка} b. end; {конец записи} var{см. Описание выше} PX, PY : pEl; {элементы списка} firstElem, curElem: pEl; {элементы списка} i:integer; {циклическая переменная} f:TEXT; {файловая переменная(!файл текстовый!)} {***************************} procedure AddElem(var CurElem:pEl; val:integer); {процедура добавляет в список новый элемент. CurElem – указатель на текущий элемент списка, val – значение нового элемента} var{см. Описание выше} tmpElem:pEl; {см. Описание выше} begin{начало процедуры} New(tmpElem); {создаём элемент списка} tmpElem^.Data := val; {изменяем ему данные} tmpElem^.Next := nil; {след. элемента нет} tmpElem^.Prev := CurElem; {определяем предыдущий элемент} CurElem^.Next := tmpElem; {говорим, что за текущим Эл. Списка идёт новый элемент} CurElem := tmpElem; {говороим, что текущий эл. – это наш новосозданный элемент} end; {конец процедуры} {***************************} procedure ChangePos(var firstElem,secondElem:pEl); {процедура смены позиции элементов} var{см. Описание выше} tmpElem:pEl; {см. Описание выше} begin{начало процедуры} New(tmpElem); {см. Описание выше} {Далее меняю позицию, но не данные} tmpElem^.Prev := secondElem^.Prev; tmpElem^.Next := secondElem^.Next;
firstElem^.Prev := tmpElem^.Prev; firstElem^.Next := tmpElem^.Next; end; {конец процедуры} {***************************} begin{начало программы} clrscr; {см. Описание выше} Randomize; {подключаем генератор случайных чисел} New(firstElem); {см. Описание выше} New(curElem); {см. Описание выше} firstElem^.Next := nil; {инициализация элемента списка} firstElem^.Prev := nil; {инициализация элемента списка} firstElem^.Data := random(100); {генерируем случайное число из диапазона от 0 до 100 }
curElem := firstElem; {текущий элемент – это первый элемент} for i:=1 to MaxNum do{цикл от 1 до кол-ва элементов списка} begin{начало цикла} AddElem(curElem,random(100)); {добавляем новый элемент со случайным значением от 0 до 100} if i = 1 then firstElem^.Next := curElem; {привязываем 2-й элемент к первому} if i = 13 then{предполагаем, что элемент PY на позиции 13(хотя можем указать как хотим) } begin New(PY); {создаём элемент} {далее делаем его текущим} PY^.Prev := curElem^.Prev; PY^.Next := curElem^.Next; PY^.Data := curElem^.Data; end; if i = 20 then{предполагаем, что элемент PX на позиции 20(хотя можем указать как хотим) } begin New(PX); {создаём элемент} {далее делаем его текущим} PX^.Prev := curElem^.Prev; PX^.Next := curElem^.Next; PX^.Data := curElem^.Data; end; end; {конец цикла}
ChangePos(PX,PY); {меняем позиции элементов списка} assign(f,'double_linked_list_8.txt'); {привязываем путь файла к переменной} rewrite(f); {создаём файл или перезаписываем существующий} writeln('FirstElement = ',firstElem^.Data); {выводим первый элемент} curElem := firstElem; {делаем текущий элемент первым} while (curElem <> nil) do{проход по списку} begin{начало цикла} writeln(f, curElem^.Data); {запись в файл элементов списка} curElem := curElem^.Next; {двигаемся по списку} end; {конец цикла} close(f); {закрываем файл} writeln('Press Enter'); {вывод сообщения} readln; {ожидаем нажатия клавиши}