Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2011, 13:51
Echuy Echuy вне форума
Прохожий
 
Регистрация: 11.04.2011
Сообщения: 7
Репутация: 10
По умолчанию Реализация очереди через указатели

Возникла проблема в курсовой. В постановке задачи было сказано реализовать очередь, используя только указатели (т.е. не через массивы и т.д.). Вот ,что у меня получилось:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 PElement= ^TElement;
 TElement = record
   FValue: integer;
   FNext: Pelement;
   end;
 Queue = class(Tobject)
   private

   public
     procedure Push(Value:integer);
     function Pop():integer;
     function GetValue():integer;
     function IsEmpty():boolean;
     constructor QueueCreate(Value:integer);
   end;
var
  Form1: TForm1;
  Queue1: Queue;
  Header: PElement;
implementation

{$R *.dfm}

constructor Queue.QueueCreate(Value:Integer);
var
Now:PElement;
begin
  New(now);
  New(Header);
  Now^.FValue:=Value;
  Now^.FNext:=nil;
  Header:=nil;
  Header:=Now;  // программа отрабатывает до сюда и вылетает
end;
procedure Queue.push(Value:Integer);
var
  Now:PElement;
begin
  New(now);
  Now^.FValue:=Value;
  Now^.FNext:=Header;
  Header:=Now;
end;

function Queue.pop():integer;
var
  Now:PElement;
  begin
  New(Now);
  Now:=Header;
  while not(Now^.FNext^.FNext = nil) do
  Now:=Now^.FNext;
  result:=Now^.FNext^.FValue;
  dispose(Now^.FNext^.FNext);
  Now^.FNext:=nil;
end;

function Queue.GetValue():integer;
var
Now:PElement;
begin
  New(Now);
  Now:=Header;
  while Now^.FNext = nil do
    Now:=Now^.FNext;
  result:=Now^.FValue;
end;

function Queue.IsEmpty():boolean;
begin
If Header=nil then result:=false else result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin;
  Queue1.QueueCreate(0); // ошибка при завершении операции
  Queue1.Push(9);
end;

end.
Вроде, все просто: элемент очереди типа "запись", класс для организации и работы с очередью.
Казалось бы, все компилится, значит, половина дела сделана. Но! Вылетает ошибка при создании очереди (пометил их в коде комментариями), ругается на кривой доступ к памяти. Ковыряюсь уже порядка недели по паре часов в день, никак не могу понять, где я не прав.

З.Ы. Переменная Header в изначальном варианте вообще должна была быть полем у создаваемого класса.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter