- •Просуков е.А., Пащенко о.Б.
- •(Упрощенная версия для однонаправленных списков)
- •Содержание
- •1. Ссылки , динамические переменные и структуры.
- •Адресный тип-указатель, ссылочные переменные, простейшие действия с указателями.
- •Практические примеры работы с несвязанными динамическими данными.
- •2.1. Разновидности связанных списков
- •3 . Приемы программирования по работе со списком .
- •3.1 Создание пустого списка.
- •Ввод-вывод содержимого информационных полей списка .
- •Включение и исключение элементов из списка .
- •Процедуры включения элементов .
Включение и исключение элементов из списка .
Процедуры включения элементов .
Содержательной частью процедуры AddtoHead (добавление узла в начало списка) являются операторы создания(открытия) узла и операторы присоединения (привязки) узла к «голове» списка, используя при этом поля указателей prev и next:
procedure AddtoHead;
var newnode:ptrnode;
begin
new(newnode); {открыт (создан) новый узел, выделена память}
write('name '); readln(newnode^.info.name); {заполнение информационных полей}
write('age '); readln(newnode^.info.age); { нового узла}
write('group '); readln(newnode^.info.group);
current:=list0.head; {установка текущего(служебного) указателя на начало списка}
list0.head:=newnode; {установка(перемещение) указателя-признака начала списка
на новый узел, он теперь будет головным}
newnode^.next:=current; {привязка нового узла к началу списка по полю указателя next}
end;
Алгоритм процедуры AddAfterNumber(добавление узла после заданного) также
состоит из двух основных действий: первое-это создание узла, а второе-это его включе-ние(привязка) в заданное место цепочки линейного списка, используя при этом поле указателя next:
procedure AddAfterNumber(number:integer);
var i:integer;
TempPred,TempPosl,newnode:ptrnode;
begin
new(newnode);
write('new name '); readln(newnode^.info.name);
write('new age '); readln(newnode^.info.age);
write('new group '); readln(newnode^.info.group);
current:=list0.head;
i:=1;
while (i<>number) and (current<>nil) do
begin
i:=i+1; current:=current^.next;
end;
{Оператор цикла while do предназначен для перемещения текущего указателя current в заданное место списка, на узел после которого добавляется новый. Цикл работает до тех пор пока номер заданного узла(переменная number) не совпадет со значением счетчика i и до тех пор пока список не кончился(current<>nil)}
{1} TempPosl:=current^.next; { установка служебного указателя на следующий после заданного узел, т.е. на тот перед которым вставляется новый}
{2} TempPred:=current; { установка служебного указателя на следующий после
заданного узел, т.е. на тот перед которым вставляется новый}
{3} TempPred^.next:=newnode; {устанавливаем связь между новым узлом и узлом после
которого он вставляется(связь по полю указателя next слева-направо)}
{5} newnode^.next:=TempPosl; {устанавливаем связь между новым узлом и узлом перед которым он вставляется(связь по полю указателя next слева-направо)}
end;
На рис.3.3 графически интерпретированы действия операторов программы.
{2} {1}
info
info
next
newnode
info
next
next
{3} {5}
Рис.3.3
Рис.3.4
