- •1 Линейные двусвязные списки
- •2 Основные операции над списком
- •2.1 Добавление элемента в список
- •2.2 Удаление элемента из списка
- •2.3 Вставка элемента внутри списка
- •3 СоЗдание, просмотр и уничтожение списка
- •Упражнения
- •4 Поиск элемента в списке
- •5 Перемещение элементов списка
- •Упражнения
- •6 Примеры обработки списка
- •Упражнение
- •Упражнение
- •Упражнения
- •Литература
2.2 Удаление элемента из списка
Удаление первого элемента непустого списка
procedure Del_first(var first, last: link);
begin
if first = last then { один элемент в списке }
begin
dispose(first);
first:=nil; last:=nil
end
else
begin
first:=first^.next;
dispose(first^.prev);
first^.prev:=nil
end
end;
Удаление последнего элемента непустого списка
procedure Del_last(var first, last: link);
begin
if first = last then { один элемент в списке }
begin
dispose(first);
first:=nil; last:=nil
end
else
begin
last:=last^.prev;
dispose(last^.next);
last^.next:=nil
end
end;
Удаление элемента внутри списка
Входной параметр – указатель p на удаляемый элемент списка
procedure Del_el(p: link);
begin
p^.next^.prev:=p^.prev;
p^.prev^.next:=p^.next;
dispose(p)
end;
Удаление элемента внутри списка
Указатель p – входной и выходной параметр:
на входе – адрес удаляемого элемента списка,
на выходе – адрес следующего после удалённого элемента.
procedure Del_p_next(var p: link);
begin
p:=p^.next; {указатель перемещается на следующий элемент списка}
p^.prev:=p^.prev^.prev;
dispose(p^.prev^.next);
p^.prev^.next:=p
end;
2.3 Вставка элемента внутри списка
Вставка нового элемента после заданного элемента
Входные параметры:
p – указатель на заданный элемент списка,
x – значение информационного поля нового элемента.
procedure DInsert_next(p: link; x:integer);
begin { элемент не последний }
new(p^.next^.prev);
p^.next^.prev^.inf:=x;
p^.next^.prev^.prev:=p;
p^.next^.prev^.next:=p^.next;
p^.next:=p^.next^.prev
end;
Вставка нового элемента перед заданным элементом
Входные параметры:
p – указатель на заданный элемент списка,
x – значение информационного поля нового элемента.
procedure DInsert_prev(p: link; x:integer);
begin { элемент не первый }
new(p^.prev^.next);
p^.prev^.next^.inf:=x;
p^.prev^.next^.prev:=p^.prev;
p^.prev^.next^.next:=p;
p^.prev:=p^.prev^.next
end;
3 СоЗдание, просмотр и уничтожение списка
Пример 3.1 Создать линейный двусвязный список. Информация содержится в текстовом файле. Выдать значения информационных полей элементов списка. Уничтожить список.
program Dlist;
type link = ^rec;
rec = record
inf:integer;
prev, next:link
end;
var first, last : link; {указатели на начало и конец списка}
f : text; fname : string;
{создание списка добавлением в конец списка}
procedure DCreate(var first, last : link; var f:text);
var p : link; {указатель на новый элемент}
begin
reset(f);
first:=nil; last:=nil;
while not eof(f) do
begin
new(p); read(f,p^.inf);
p^.prev:= last; p^.next:=nil;
if last<>nil then last^.next:=p
else first:=p;
last:=p
end;
close(f)
end;
{просмотр списка проходом от первого до последнего элемента}
procedure DView(first : link);
begin
while first<>nil do
begin
write(first^.inf,' '); first:=first^.next
end;
writeln
end;
{уничтожение списка}
procedure Del_DList(var first, last:link);
var p:link; {указатель на текущий элемент}
begin
while first<>nil do
begin
p:=first; first:=first^.next;
dispose(p)
end;
last:=nil
end;
begin {основная программа}
write('введите имя файла '); readln(fname);
assign(f,fname);
DCreate(first, last, f);
writeln('список: '); DView(first);
Del_DList(first, last); writeln('список удален')
end.