Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2013, 22:04   #1
alexanderrrr
Пользователь
 
Регистрация: 16.06.2012
Сообщений: 11
По умолчанию Delphi. Программно организовать очередь в виде однонаправленного списка из элементов типа rec

вобщем, такие дела, вот задание, код я кое как написал, но, правда немного не так, можете мне помочь с ним разобраться?

Программно организовать очередь в виде однонаправленного списка из элементов типа 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(aQueuePDel) 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(aQueuePElem) do begin
    QueuePush
(QTmpPElem);
    if 
Result <> '' then Result := Result ', ';
    
Result := Result IntToStr(PElem^.Data);
  
end;
 
  
aQueue := QTmp;
end;
 
procedure TForm1.Button1Click(SenderTObject);
const
  
Fn 'file.txt';
var
  
TextFile;
  
Q1Q2Q3 TQueue;
  
PElem TPElem;
  
SFileName String;
  
F1F2 Boolean;
begin
  
//Полное имя файла.
  
FileName := ExtractFilePath(ParamStr(0)) + Fn;
  if 
not FileExists(FileNamethen begin
    ShowMessage
('Файл не найден. Действие отменено.');
    Exit;
  
end;
 
  
//Начальная инициализация очередей.
  
QueueInit(Q1);
  
QueueInit(Q2);
  
QueueInit(Q3);
 
  
AssignFile(FFileName);
  
Reset(F);
  
//Читаем числа из файла и записываем их в очереди так, чтобы в первую очередь
  //записывались только неотрицательные числа, а во вторую - отрицательные.
  
while not Eof(F) do begin
    Readln
(FS);
    if 
'' then Continue;
    New(
PElem);
    
PElem^.Data := StrToInt(S);
    if 
PElem^.Data >= 0 then
      QueuePush
(Q1PElem)
    else
      
QueuePush(Q2PElem);
  
end;
  
CloseFile(F);
 
  
//Теперь, переписываем элементы из двух очередей в третью очередь таким
  //образом, чтобы неотрицательные и отрицательные числа чередовались.
  
repeat
    F1 
:= QueuePop(Q1PElem);
    if 
F1 then QueuePush(Q3PElem);
    
F2 := QueuePop(Q2PElem);
    if 
F2 then QueuePush(Q3PElem);
  
until not (F1 or F2);
 
  
//Распечатка результирующей очереди.
  
Memo1.Lines.Add('--------------------------------------------------');
  
Memo1.Lines.Add('Результирующая очередь (начало - конец):');
  
Memo1.Lines.AddQueueToStr(Q3) );
 
  
//Удаляем очереди из памяти.
  
QueueFree(Q1);
  
QueueFree(Q2);
  
QueueFree(Q3);
  
Memo1.Lines.Add('----------');
  
Memo1.Lines.Add('Очереди удалены из памяти.');
end
alexanderrrr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переворот однонаправленного списка ShockTrooper Помощь студентам 1 28.10.2012 22:16
Заполнение связного однонаправленного списка с++ Chelovekpredel Помощь студентам 1 07.10.2012 16:39
удаление циклического однонаправленного списка.. Yakoot Visual C++ 9 18.06.2011 20:05
массив типа char в виде списка saidmir Общие вопросы C/C++ 9 20.08.2010 21:38
Очередь в виде двусвязного списка. dimorik Общие вопросы C/C++ 9 10.06.2010 02:24