Удаление указанного элемента из двунаправленного списка
Лекция №1.
Двунаправленный список. Кольцо
- Понятие двунаправленного списка, кольца.
Элементы двунаправленного списка описываются аналогично элементам однонаправленного списка, с той лишь разницей, что добавляется описание второго указателя. Один из указателей ссылается на следующий элемент, а другой — на предыдущий элемент списка. Двунаправленный список можно представить в виде перекидного календаря, элементы которого упорядочены:
Type
<имя типа>=^<имя>;
<имя>=record
<имя_информационной_часпш>:<тип_информац._части>;
<имя_указателя_1>,<имя_указателя_2>:<имя_типа>;
епd;
Например, описание двунаправленного списка, у которого в информационной части (inf) каждого элемента содержится символ, указатель на следующий элемент назван sled, а на предыдущий — рrеd:
type kolco=^k;
k=record
inf:char;
sled, pred:kolco;
end;
- Операции над элементами двусвязного списка
Добавление элемента в двунаправленный список до указанного
Головной элемент head необходим для исключения повторного обхода.
Создание кольцаначинается с создания головного элемента:
new (head);
head^.sled:=head;
head^.pred:=head;
Вставка “после”:
young^.pred:=old;
young^.sled:=old^.sled;
old^.sled^.pred:=young;
old^.sled:=young;
Вставка “до”:
young^.sled:=old;
young^.pred =old^.pred;
old^.pred ^.sled:=young;
old^.pred:=young.
1.Исходное состояние:
2.Выделение памяти под новый элемент: new(p);
3. Занесение информации в новый элемент:
p^.inf:=88;
4.Установка связей между элементами: 4.1. p^.pred:=ukaz^. pred (p^.pred будет указывать на тот элемент, на который указывает ukaz^.pred);
4.2. p^.sled:=ukaz (p^.sled будет указывать на тот элемент, на который указывает ukaz);
4.3. ukaz^.pred^.sled:=p (ukaz^.pred^.sled – это указатель sled элемента, стоящего перед указанным/ будет указывать на тот элемент, на который указывает р);
4.4. ukaz^.pred:=p (ukaz^.pred будет указывать на тот элемент, на который указывает р);
Добавление элемента в двунаправленный список после указанного
- Исходное состояние:
2. Выделение памяти под новый элемент new(p);
3. Занесение информации в новый элемент:
p^.inf:=88;
4. Установка связей между элементами: 4.1. p^.sled:=ukaz^. sled (p^.sled будет указывать на тот элемент, на который указывает ukaz^.sled);
4.2. p^.pred:=ukaz (p^.pred будет указывать на тот элемент, на который указывает ukaz);
4.3. ukaz^.sled^.pred:=p (ukaz^.sled^.pred – это указатель pred элемента, стоящего перед указанным/ будет указывать на тот элемент, на который указывает р);
ukaz^.sled:=p(ukaz^.sled будет указывать на тот элемент, на который указывает р);
Удаление указанного элемента из двунаправленного списка
(на удаляемый элемент указывает Ukaz)
Ukaz^.pred^.sled:=Ukaz^.sled;
Ukaz^.sled^.pred:=Ukaz^.pred;
dispose (Ukaz);
В отличие от двунаправленного списка однонаправленный обеспечивает последовательный просмотр элементов списка только от начала до конца.
Пример: Функция поиска в списке.
Необходимо найти элемент Res, информационная часть которого содержит значение i1.
function poisk (nead:ukaz; i1:integer; var p:ukaz):booleam;
var u:ukaz;
begin
poisk:=false;
res:=nil;
u:=nead;
while (u<>nil) and (p=nil) do
begin
if u^.inf=i1 then begin
poisk:=true;
p:=u
end;
u:=u^.next;
end
end;