Детская игра "Считалка"
В некотором файле находится список игроков. Необходимо выбрать ведущего игрока. Для этого выбирается произвольное число Н, игроки встают в круг и выкидывают из круга каждого Н-того игрока, пока не останется лишь один человек. Написать программу, печатающую вышедших в процессе рассчета игроков. Необходимо использовать динамические структуры данных (связанные списки).
program shitalka;
const nOut = 5;
type
ptrNameList = ^nameList;
nameList = record
name:String;
next:ptrNameList;
end;
var firstElement,element:ptrNameList;
f:text;
nameString:String;
i,nInList:byte;
procedure deleteElement(element2Del:ptrNameList);
var prevElement:ptrNameList;
i:word;
begin
prevElement := firstElement; i:=0;
while ((prevElement^.next <> element2Del) and (i<nInList)) do
begin
prevElement := prevElement^.next; inc(i);
end;
prevElement^.next := element2Del^.next;
if (element2Del=firstElement) then
firstElement:=element2Del^.next;
writeln;writeln('removed: '+element2Del^.name);
dispose(element2Del);
dec(nInList);
end;
procedure printList;
var element,lastEl:ptrNameList;
k:byte;
begin
element := firstElement; k:=0;
while (k<nInList) do
begin
write(element^.name+', '); inc(k);
element := element^.next;
end;
end;
begin
firstElement := nil;
assign(f,'list.txt');
reset(f); nInList:=0;
if (IOResult>0) then
begin
writeln('File list.txt not found.');halt;
end;
while not eof(f) do
begin
readln(f,nameString);
if (firstElement = nil) then
begin
new(element);
firstElement := element;
end
else
begin
new(element^.next);
element := element^.next;
end;
element^.name := nameString;
element^.next := firstElement;
inc(nInList);
end;
close(f);
element := firstElement;
write('Initial list:');
printList;
element := firstElement;
while (element^.next<>element) do
begin
i:=0;
while ((element^.next<>element) and (i<nOut-1)) do
begin
element := element^.next;
inc(i);
end;
if (element^.next<>element) then
begin
deleteElement(element);
write('Rest: ');
printList;
element := element^.next;
end;
end;
end.
|