Теоретический материал: стеки, очереди, кольца (Паскаль)

Решение задач с применением динамической структуры кольцо

Задание. Рассмотрите приведенную программу, наберите ее на компьютере, вставьте комментарий.

Задача 1.  N ребят располагаются по кругу. Начав отсчет от первого, удаляют каждого k-го, смыкая при этом круг. Определить порядок удаления ребят из круга.

Program Schitalka;
Type
  Children = ^Child;
  Child = record
       Name : string;
       Next : Children;
  end;
Var
  Circle, p, Temp : Children;
  k, i, j, NumName : integer;
  text : string;
Function NumSlov(Var S : string) : integer;
Var
  i, d : integer;
Begin
  d := 0;
  i := 1;
  while i <= Length(S) do
    begin
      while (S[i] = ' ') and (i <= Length(S)) do
        Inc(i);
      while (S[i] <> ' ') and (i <= Length(S)) do
        Inc(i);
      d := d+1;
    end;
  if S[Length(S)] = ' '
    then
      d := d-1;
  NumSlov := d;
End;
Procedure AddName(Var Old, Young : Children);
Begin
  Young^.Next := Old^.Next;
  Old^.Next := Young;
End;
Begin
  new(Circle);
  Circle^.Next := Circle;
  writeln('Считалка');
  writeln('Введите текст считалки >');
  readln(text);
  k := Numslov(text);
  writeln('Сколько человек в кругу? >');
  readln(NumName);
  temp := Circle;
  for i:= 1 to NumName do
    begin
      write('Введите ',i,'-е имя:');
      if i = 1
        then
          readln(Circle^.name)
        else
          begin
            new(p);
            readln(p^.name);
            AddName(temp, p);
            temp:=p;
          end;
    end;
  temp := Circle;
  for i := 1 to NumName-1 do
    begin
      for j := 1 to k-1 do
        begin
          p := temp;
          temp := temp^.next;
        end;
      writeln(temp^.name, '- вышел');
      p^.next:= temp.Next;
      dispose (temp);
      temp:=p^.Next;
    end;
  writeln(temp^.name, '- остался');
  dispose (temp);
end.