logo
Разработка программного обеспечения видеотеки

3.1 Процедура добавления

Алгоритм добавления элемента в указанное место двунаправленного списка заключается в следующем.

Порождается новое звено и заполняется информационное поле. Полям UpPointer и DownPointer присваивается null. Проверяется, если список пуст то новые становится первым звеном списка. В противном случае новое звено добавляется в список через процедуру вставки.

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

При этом в поле DownPointer порожденного звена заносится ссылка на следующий элемент из звена, предшествующего вставляемому.

В поле UpPointer порожденного звена заносится ссылка на предыдущий элемент из звена, следующего за вставляемым.

В поле UpPointer следующего за вставляемым звена заносится ссылка на вставляемое звено.

В поле DownPointer предшествующего звена заносится ссылка на вставляемое звено.

Процедура Add. Добавление элемента в список.

procedure Add(SubjList: PointerSubjs); {процедура добавления элемента в список}

var PSubj, marker: PointerSubjs;

begin

WriteTitle(1,Add film); {выводим заголовок}

new (PSubj); {отводим память под новую динамическую переменную}

WriteForm(1,2,PSubj); {выводим и заполняем форму}

PSubj^.UpPointer := nil;

PSubj^.DownPointer := nil;

if SubjList=nil then SubjList := PSubj {присваиваем значение первому звену}

else

{добавляем элемент через процедуру вставки в список}

begin

marker := SubjList;

while (marker^.Subject<Subj^.Subject)AND(marker^.DownPointer<>nil) do

marker := marker^.DownPointer;

if (marker^.UpPointer=nil) AND (marker^.Subject>Subj^.Subject)

then

begin

Subj^.DownPointer := marker;

marker^.UpPointer := Subj;

SubjList:=Subj;

end

else

if (marker^.DownPointer=nil) AND (marker^.Subject<Subj^.Subject)

then

begin

Subj^.UpPointer := marker;

marker^.DownPointer := Subj;

end

else

{в остальных случаях добавляем элемент в середину списка перед текущим звеном}

begin

Subj^.DownPointer := marker;

Subj^.UpPointer := marker^.UpPointer;

marker^.UpPointer := Subj;

marker := Subj^.UpPointer;

marker^.DownPointer := Subj;

end;

end;

WriteTitle(16, Film was added);

ReadKey;

end;