В программе формирования очереди учтены два частных случая:
а) исходный файл пустой; тогда и очередь должна быть пустой, о чем свидетельствует значение L = nil;
б) в файле содержится лишь одно число; тогда адрес единственного элемента очереди определяют оба указателя L и R.
Будем считать, что адрес очередного элемента очереди определяет текущий указатель Run, и рассмотрим два этапа формирования очереди:
1) из файла прочитан первый элемент, включаемый в очередь (возможно, этот элемент останется единственным в очереди);
2) из файла прочитан второй элемент.
Признаком первого этапа является равенство L = nil. На этом этапе должны быть выполнены следующие действия:
Run^.Next:=nil; L:=Run; R:=Run
Значение L<>nil является признаком чтения из файла следующего элемента очереди. В этом случае должно быть выполнено:
Run^.Next:=nil; R^.Next:=Run; R:=Run
Тогда программа формирования очереди будет иметь следующий вид:
L:=nil; R:=nil;
While not SeekEof(F) do
Begin
Read(F,k);
New(Run);
Run^.Inf:=k;
IfL=nil then
Begin
Run^.Next:=nil;
L:=Run; R:=Run
End
Else
Begin
Run^.Next:=nil;
R^.Next:=Run;
R:=Run;
End;
End;
В альтернативах условного оператора имеются одинаковые операторы. Это позволяет записать программу формирования очереди в более компактном виде:
L:=nil; R:=nil;
While not SeekEof(F) do
Begin
Read(F,k);
New(Run); Run^.Inf:=k;
Run^.Next:=nil;
IfL=nil then
L:=Run
Else
R^.Next:=Run;
R:=Run;
End;
Примечание. Элементы очереди, в отличие от стека, располагаются в том же порядке, что и в файле. Если же почему-либо требуется, чтобы относительный порядок элементов в очереди был обратным, то добавление новых элементов нужно производить слева, а не справа (как в стеке).