Дан двухсвязный список их N игроков. Начиная с игрока m, каждый k-ый игрок должен быть удален из игры.
Вот что у меня получилось:
КОД (Показать/Скрыть)
Program P7; Uses Crt;
type List=^Celula;
Celula=record
Info:String;
Prec, Urm:Lista;
end;
var P,V:List;
N,m,k:byte;
procedure Create;
var R:List; i:byte;
begin
writeln('List: ');
P:=nil;
V:=nil;
for i:=1 to N do
begin
new(r);
readln(R^.info);
R^.Prec:=nil;
R^.Urm:=nil;
if P=nil then begin
P:=R;
V:=R; end //If
else begin
V^.Urm:=R;
R^.Prec:=V;
V:=R;
end //Else
end; //For
R^.Urm:=P; //тут я не уверен если правильно сделал что-бы список был циклинчным
P^.Prec:=V;
P:=V;
end; //Create
procedure Destroy(R:List);
begin
if (P^.Urm=P) and (R=P) then //процедуру взял с форума
begin
writeln('Leave: ',P^.Info);
dispose(P);
P:=nil;
exit;
end;
writeln('Leave ',R^.info);
R^.Prec^.Urm:=R^.Urm;
R^.Urm^.Prec:=R^.Prec;
if R=P then P:=P^.Urm;
dispose(r); R:=nil; //пишет invalid pointer operation
end;
procedure Start;
var i:integer; R:list;
begin
i:=0;
R:=P;
while R<>nil do begin
i:=i+1;
R:=R^.Urm;
if i=m then break; //Находим m-ый элемент
end;
i:=k;
while R<>nil do
if i=k then begin
Destroy(r);
i:=0; end
else
begin
i:=i+1; R^.R.Urm;
end;
Begin
write('Player Number: '); readln(N);
write('Position '); readln(m);
write('Ration '); readln(k);
Create;
Start;
readln;
end.