Циклічно зв'язні списки

Циклічно зв'язаним списком (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;
Де,
Number - поле для збереження порядкового номера елемента
Mumber - поле для хранения данных элемента
Prev і Next - вказівники на попередній і наступний елемент відповідно

Як бачимо структура вузла списку залишилася незмінної в порівнянні з одне- і двозв'язаними списками. Відрізняється тільки останній етап створення списку. Приведемо текст програми створення такого списку на основі двозв'язаного списку.

Наведемо приклад створення подібних структур

Uses crt;
Type ListPtr=^list;
List =record
Mumber,nber:longint;
prev:listPtr; Next: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.

[Виконати програму ]

[ Назад | Зміст ]