Циклічно зв'язаним списком (circulary linked list) називається такий список, у якому останній вузол зв'язаний з першим вузлом. Тому завжди існує можливість доступу до будь-якого елемента списку. починаючи з довільно обраного.
Такий список можна описати як однозв'язний чи двозв'язаний:
Type ListPtr = ^List; List = Record Number : Longint; Member : Longint; Next: ListPtr; Prev: ListPtr; End; |
Type ListPtr = ^List; List = Record Number : Longint; Member : Longint; Next: ListPtr; End; |
Type ListPtr = ^List; List = Record Number : Longint; Member : Longint; Prev: ListPtr; End; |
Як бачимо структура вузла списку залишилася незмінної в порівнянні з одне- і двозв'язаними списками. Відрізняється тільки останній етап створення списку. Приведемо текст програми створення такого списку на основі двозв'язаного списку.
Var
endlst,cl, firstlst:Pointer;
c :Char;
link
:ListPtr;
Flag :Boolean; x,y :Integer;
Procedure Input (Var list:listPtr);
Var i :longint;
Temp
:pointer;
Ch :char;
Begin
ch:=' '; i:=1; x:=20;
y:=12;
temp:=nil;
GotoXY(5,2);
Writeln('Для продовження натисніть
пробіл. Для скасування Esc');
While
(ord(ch)<>27)and(MaxAvail>Sizeof(ListPtr)) do
Begin
GotoXY
(x,y);
New(list);
if i=1
then
firstlst:=list;
list^.mumber:=i;
list^.nBer:=I;
Write ('Введіть
елемент списку за номером ',і,':
');
Readln(list^.Mumber);
List^.prev:=Temp;
List^.prev^.Next:=list;
temp:=list;
gotoXY(78,2);
memw[0:$41a]:=memW[0:$41c];
ch:=readKey;
GotoXy(x,y);
Delline; I:=I+1;
End;
While
list^.Next:=FirstLst;
List^.Next^.Prev :=List;
Endlst:=list;
End;
Procedure Writelst(var list:listPtr; var ch:char); {output}
var
Temp:
listPtr;
Begin
GotoXy(28,2);
Writeln('Елементи Списку:
');
Window(1,3,80,25);
GotoXy(28,1);
Write('[');
Case ch
of
'P','p','Р','р': begin list:=firstlst; Temp:=endlst; end;
'O','o','О','о':begin list:=endlst; Temp:=firstlst;
end;
end;
While list<>Temp
do
Begin
If (Wherex>70)and(Wherey=21)
Then
Begin
Write('..');
GotoXY(20,wherey);
Write('Для продовження натисніть
пробіл:');
Memw[0:$41a]:=memw[0:$41c]; c:=readKey; Clrscr; GotoXY(28,1);
Write(']...');
end
else
Write(list^.mumber,',');
Case ch
of
'P','p','Р','р':list:=list^.Next;
'O','o','О','о':list:=list^.prev;
end;
Case
End; While
GotoXy(WhereX-1,WhereY);Write(']');
End;
Begin
Clrscr;
Firstlst:=nil; Endlst:=nil; Mark(cl);
input(link);
GotoXY(30,9); Writeln('Р-від початку до
кінця');
GotoXY(30,10);Writeln('Від Кінця до початку');
GotoXY(10,12);Writeln('Визначите напрямок введення натисканням
відповідної клавішею');
Flag:=true;
While flag
do
Begin
Memw[0:$41a]:=memw[0:$41c]; c:=readKey;
GotoXY(10,22);
DelLine;
Case c of
'P','p','Р','р':Begin Flag:=false; link:=firstlst; end;
'O','o','О','о':Begin Flag:=false; link:=Endlst;
end;
Else
Begin
GotoXy(28,22); Writeln('ВИ Помилилися, Повторите...');
GotoXy(73,12); end;
end; Case
end;
While
clrscr;
Writelst(linK,c);
Readkey; clrscr;
Writelst(link,c);
Release(cl); Memw[0:$41a]:=memw[0:$41c];
ReadKey;
end.