вобщем, такие дела, вот задание, код я кое как написал, но, правда немного не так, можете мне помочь с ним разобраться?
Программно организовать очередь в виде однонаправленного списка из элементов типа rec:
Type ptr=^rec;
rec=record
key:integer;
s: ptr;
end;
Var t:rec;
Во входном файле задана последовательность из равного количества положительных и отрицательных целых чисел, за которой следует нуль.
Ввести эти числа и вывести их, чередуя положительные числа (на нечетных местах) с отрицательными (на четных), причем исходный взаимный порядок как среди положительных, так и отрицательных чисел должен быть сохранен.
PHP код:
type
//Указатель на элемент списка (это элемент очереди).
TPElem = ^TElem;
//Элемент списка.
TElem = record
Data : Integer; //Основные данные.
PNext : TPElem; //Указатель на следующий элемент списка.
end;
//Очередь.
TQueue = record
PFirst, PLast : TPElem; //Указатели на первый и на последний элемент очереди.
end;
//Инициализация очереди. Внимание! Эту процедуру можно выполнять только в том
//случае, если очередь пуста. Иначе, произойдут утечки памяти.
//Эту процедуру следует выполнять только для начальной инициализации очереди.
procedure QueueInit(var aQueue : TQueue);
begin
aQueue.PFirst := nil;
aQueue.PLast := nil;
end;
//Добавление элемента в конец очереди.
procedure QueuePush(var aQueue : TQueue; var aPElem : TPElem);
begin
if aPElem = nil then Exit;
aPElem^.PNext := nil;
if aQueue.PFirst = nil then
aQueue.PFirst := aPElem
else
aQueue.PLast^.PNext := aPElem
;
aQueue.PLast := aPElem;
end;
//Изъятие элемента из начала очереди.
//Если очередь не пуста, то из её начала изымается элемент и возвращается
//через параметр aPElem. В этом случае, функция возвращает значение True.
//Если очередь пуста, то операция отменяется, а функция возвращает значение False.
function QueuePop(var aQueue : TQueue; var aPElem : TPElem) : Boolean;
begin
Result := False;
if aQueue.PFirst = nil then Exit;
aPElem := aQueue.PFirst;
aQueue.PFirst := aPElem^.PNext;
if aQueue.PFirst = nil then aQueue.PLast := nil;
Result := True;
end;
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
PDel : TPElem;
begin
while QueuePop(aQueue, PDel) do Dispose(PDel);
end;
//Распечатка очереди.
function QueueToStr(var aQueue : TQueue) : String;
var
QTmp : TQueue;
PElem : TPElem;
begin
if aQueue.PFirst = nil then begin
Result := 'Очередь пуста.';
Exit;
end;
Result := '';
//Инициализация вспомогательной очереди.
QTmp.PFirst := nil;
QTmp.PLast := nil;
//Переливаем элементы из исходной очереди во временную и при этом
//выполняем распечатку.
while QueuePop(aQueue, PElem) do begin
QueuePush(QTmp, PElem);
if Result <> '' then Result := Result + ', ';
Result := Result + IntToStr(PElem^.Data);
end;
aQueue := QTmp;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
Fn = 'file.txt';
var
F : TextFile;
Q1, Q2, Q3 : TQueue;
PElem : TPElem;
S, FileName : String;
F1, F2 : Boolean;
begin
//Полное имя файла.
FileName := ExtractFilePath(ParamStr(0)) + Fn;
if not FileExists(FileName) then begin
ShowMessage('Файл не найден. Действие отменено.');
Exit;
end;
//Начальная инициализация очередей.
QueueInit(Q1);
QueueInit(Q2);
QueueInit(Q3);
AssignFile(F, FileName);
Reset(F);
//Читаем числа из файла и записываем их в очереди так, чтобы в первую очередь
//записывались только неотрицательные числа, а во вторую - отрицательные.
while not Eof(F) do begin
Readln(F, S);
if S = '' then Continue;
New(PElem);
PElem^.Data := StrToInt(S);
if PElem^.Data >= 0 then
QueuePush(Q1, PElem)
else
QueuePush(Q2, PElem);
end;
CloseFile(F);
//Теперь, переписываем элементы из двух очередей в третью очередь таким
//образом, чтобы неотрицательные и отрицательные числа чередовались.
repeat
F1 := QueuePop(Q1, PElem);
if F1 then QueuePush(Q3, PElem);
F2 := QueuePop(Q2, PElem);
if F2 then QueuePush(Q3, PElem);
until not (F1 or F2);
//Распечатка результирующей очереди.
Memo1.Lines.Add('--------------------------------------------------');
Memo1.Lines.Add('Результирующая очередь (начало - конец):');
Memo1.Lines.Add( QueueToStr(Q3) );
//Удаляем очереди из памяти.
QueueFree(Q1);
QueueFree(Q2);
QueueFree(Q3);
Memo1.Lines.Add('----------');
Memo1.Lines.Add('Очереди удалены из памяти.');
end;