Міністерство освіти і науки України
Хмельницький національний університет
Кафедра системного програмування
Лабораторна робота №2
з програмування
на тему:
«Двозв’язні списки»
Лабораторна робота №2
Тема: двозв'язні списки.
Мета: навчитися програмувати з використанням вказівників та динамічних змінних, створювати та опрацьовувати двозв'язні списки.
Завдання
Дано «покажчик» на один з елементів непустого двозв'язного списку. Видалити зі списку даний елемент і вивести два «покажчика»: на елемент, що передує вилученому і на елемент, що іде за вилученим (один або обидва цих елементи можуть бути відсутніми; для відсутніх елементів виводити nil). Після видалення елемента зі списку звільнити пам'ять, займану цим елементом.
uses crt;
type vkaz=^spysok;
spysok=record
num:integer;
next,
last:vkaz
end;
procedure add(var a,head,tail:vkaz; D:integer);
begin
if a=nil then
begin
new(a);
a^.next:=nil;
a^.last:=nil;
head:=a;
end
else
begin
new(a^.next);
a^.next^.last:=a;
a:=a^.next;
a^.next:=nil;
end;
a^.num:=D;
tail:=a;
end;
procedure create(var a,head,tail:vkaz; var n:integer);
var i,D:integer;
begin
repeat
write('vvedit kilkist chysel: ');
readln(n)
until n>0;
for i:=1 to n do
begin
add(a,head,tail,random(50));
write(a^.num,' ');
end;
writeln;
end;
procedure Search(var a:vkaz; head:vkaz; var D:integer);
var p:boolean;
begin
repeat
write('vvedit element dlja vydalennja: ');
readln(D);
a:=head;
while (a<>nil) and (d<>a^.num) do a:=a^.next;
if a^.num=D then p:=true
until p;
end;
procedure DelEl(var a:vkaz; head:vkaz);
var temp:vkaz; D:integer;
begin
search(a,head,D);
if (a^.last=nil) and (a^.next=nil) then
begin
writeln('poperednij element=NIL');
writeln('nastupnyj element=NIL');
temp:=a;
a:=nil;
dispose(temp);
end
else
begin
if (a^.last=nil) or (a^.next=nil) then
begin
if a^.last=nil then
begin
writeln('poperednij element=NIL');
writeln('nastupnyj element: ',seg(a^.next^),ofs(a^.next^));
temp:=a;
a^.next^.last:=nil;
dispose(temp);
end;
if a^.next=nil then
begin
writeln('nastupnyj element=NIL');
writeln('poperednij element: ',seg(a^.last^),ofs(a^.last^));
temp:=a;
a^.last^.next:=nil;
dispose(temp);
end;
end
else
begin
writeln('poperednij element: ',seg(a^.last^),ofs(a^.last^));
writeln('nastupnyj element: ',seg(a^.next^),ofs(a^.next^));
temp:=a;
a^.last^.next:=a^.next;
a^.next^.last:=a^.last;
dispose(temp);
end;
a:=head;
while a<>nil do
begin
write(a^.num,' ');
a:=a^.next;
end;
end;
end;
procedure free(var a,tail:vkaz);
var temp:vkaz;
begin
if a<>nil then
begin
a:=tail;
while a<>nil do
begin
temp:=a;
a:=a^.last;
dispose(temp);
end;
end
else dispose(a);
end;
var el,head,tail:vkaz; n,d:integer;
begin clrscr; randomize;
create(el,head,tail,n);
DelEl(el,head);
free(el,tail);
repeat until keypressed;
end.
Результати виконаної програми:
/
/
/
Висновок. Виконавши лабораторну роботу, я закріпив навички роботи з вказівниками, динамічними змінними та динамічними структурами даних; засвоїв алгоритми створення двозв’язного списку з різною кількістю елементів та додавання, пошуку і видалення елементів цього списку.