|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Реализация очереди через указатели
Возникла проблема в курсовой. В постановке задачи было сказано реализовать очередь, используя только указатели (т.е. не через массивы и т.д.). Вот ,что у меня получилось:
Код:
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 в изначальном варианте вообще должна была быть полем у создаваемого класса. |