procedure pe(p:ptr);
var
q:ptr;
T: string;
begin
q := p;
while (p <> nil) and (p^.link <> nil) do begin
T := p^.info;
p^.info := p^.link^.info;
p^.link^.info := T;
p := p^.link^.link;
end;
end;
Write(' Исходный список:');
vid(top);
Writeln;
Write(' Инвертированный список:');
pe(top);
vid(top); { <-- Добавь вот это... }
Writeln;
procedure Push(n:string);
var w1,w2:ptr;
begin
new(w1);
w1^.info:=n;
w2^.link:=w1^.link; { <-- Вот это что значит??? }
w1^.link:=top;
top:=w1;
end;
procedure vid(w1:ptr);
begin
if (w1<>w2) then { <--- Здесь !!! }
begin;
vid(w1^.link);
write(w1^.info,' ')
end;
end;
last^.next := first; { Теперь это уже "кольцо" }
type
ttype = string;
plist = ^tlist;
tlist = record
info: ttype;
next: plist;
end;
var
first, last: plist;
{ Печать кольцевого списка (без рекурсии) }
procedure print(p: plist);
begin
repeat
write(p^.info, '':2);
p := p^.next;
until p = first;
writeln;
end;
{ Добавление элемента в конец списка }
procedure append(x: ttype);
var p: plist;
begin
new(p);
p^.info := x;
p^.next := nil;
if first = nil then first := p
else last^.next := p;
last := p
end;
{ Та процедура, которая тебе нужна }
procedure change(p: plist);
var
q: plist;
is_first: boolean;
T: ttype;
begin
is_first := true;
repeat
if (is_first or (p <> first)) and (p^.next <> first) then begin
T := p^.info;
p^.info := p^.next^.info;
p^.next^.info := T;
p := p^.next^.next;
end;
until (p = first) or (p^.next = first);
end;
var
X: ttype;
begin
first := nil; last := nil;
repeat
write('next element (empty string to exit): '); readln(X);
if X <> '' then append(X);
until X = '';
last^.next := first; { "Зацикливаем" список }
write('list: '); print(first);
change(first);
write('list after: '); print(first);
end.