Смекни!
smekni.com

Линейные списки. Стек. Дек. Очередь (стр. 7 из 10)

Memo1: TMemo;

Label7: TLabel;

Image6: TImage;

Bevel1: TBevel;

Panel7: TPanel;

Button23: TButton;

Button24: TButton;

Button25: TButton;

Button26: TButton;

Edit7: TEdit;

Image7: TImage;

Label8: TLabel;

Panel8: TPanel;

Image8: TImage;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

Button27: TButton;

Button28: TButton;

Button30: TButton;

Button29: TButton;

Button31: TButton;

Button32: TButton;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N11: TMenuItem;

N21: TMenuItem;

N31: TMenuItem;

N41: TMenuItem;

N51: TMenuItem;

N61: TMenuItem;

N71: TMenuItem;

Button33: TButton;

N9: TMenuItem;

procedure Button12Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

procedure Button22Click(Sender: TObject);

procedure Button21Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button15Click(Sender: TObject);

procedure Button16Click(Sender: TObject);

procedure Button20Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button19Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button14Click(Sender: TObject);

procedure Button13Click(Sender: TObject);

procedure Button17Click(Sender: TObject);

procedure Button18Click(Sender: TObject);

procedure Button26Click(Sender: TObject);

procedure Button25Click(Sender: TObject);

procedure Button23Click(Sender: TObject);

procedure Button24Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Button27Click(Sender: TObject);

procedure Button30Click(Sender: TObject);

procedure Button29Click(Sender: TObject);

procedure Button31Click(Sender: TObject);

procedure Button32Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure Button33Click(Sender: TObject);

procedure N21Click(Sender: TObject);

procedure N31Click(Sender: TObject);

procedure N41Click(Sender: TObject);

procedure N51Click(Sender: TObject);

procedure N61Click(Sender: TObject);

procedure N71Click(Sender: TObject);

procedure N9Click(Sender: TObject);

private

public

end;

procedure DoNewEditList;

procedure DoNewEditListTwo;

procedure DoNewEditRoundList;

var

Form1: TForm1;

ListBegin: List; //указатель на однонапр. список

ListPos: Integer; //позиция в однонапр. списке

ListTwoBegin: ListTwo; //указатель на двунапр. список

ListTwoPos: Integer; //позиция в двунапр. списке

QueueBegin: List; //указатель на очередь

QueuePos: Integer; //"позиция в очереди" (содержит кол-во символов в Edit до первого элемента)

Stack: List; //указатель на стек

StackPos: Integer; //"позиция в стеке" (содержит кол-во символов в Edit до первого элемента)

DeckBegin, DeckEnd: ListTwo; //указатели на начало и конец дека

DeckBeginPos, DeckEndPos: Integer; //"позиции в деке" (DeckEndPos содержит кол-во символов в Edit от DeckEndPosition до последнего элемента)

DeckEndPosition: Integer; //позиция последнего элемента в деке (содержит первоначальное кол-во символов в Edit до последнего элемента)

RoundList: List; //указатель в циклическом списке

RoundListPos: Integer; //"позиция в циклическом списке"

implementation

uses O_programm, Help, Un18_Lab;

{$R *.DFM}

procedure DoNewEditList;

var

q: List;

begin

q := ListBegin;

Form1.Edit1.Text := '';

while q <> nil do

begin

Form1.Edit1.Text := Form1.Edit1.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure DoNewEditListTwo;

var

q: ListTwo;

begin

q := ListTwoBegin;

Form1.Edit2.Text := '';

while q <> nil do

begin

Form1.Edit2.Text := Form1.Edit2.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure DoNewEditRoundList;

var

q: List;

begin

q := RoundList^.Next;

Form1.Edit7.Text := ' ' + IntToStr(RoundList^.Info);

while q <> RoundList do

begin

Form1.Edit7.Text := Form1.Edit7.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure TForm1.Button12Click(Sender: TObject);

var

i, j: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetQueue(QueueBegin);

if QueueBegin <> nil then

begin

while Edit3.Text[QueuePos] <> ' ' do Inc(QueuePos);

Inc(QueuePos);

s := Edit3.Text;

for i := 1 to QueuePos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit3.Text := s;

end

else

begin

ShowMessage('Очередь пуста');

Edit3.Text := '';

Image3.Hide;

Button10.Enabled := False;

Button11.Enabled := False;

Button12.Enabled := False;

StatusBar1.Panels[1].Text := 'Очередь пуста';

end;

Image3.Left := Round(QueuePos * 7);

end;

procedure TForm1.Button11Click(Sender: TObject);

begin

StatusBar1Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В очерди нельзя возвращаться в начало т.к. указатель указывает сразу на начало;');

end;

procedure TForm1.Button22Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm1.Button21Click(Sender: TObject);

var

q: List;

qTwo: ListTwo;

qQueue, rQueue: List;

Info: Integer;

FlagList: Boolean;

qStack: List;

qDeckBegin, qDeckEnd: ListTwo;

qRoundList: List; // начало циклич. списка

begin

Button1.Enabled := True;

Button2.Enabled := True;

Button3.Enabled := True;

Button4.Enabled := True;

Button5.Enabled := True;

Button6.Enabled := True;

Button7.Enabled := True;

Button8.Enabled := True;

Button9.Enabled := True;

Button10.Enabled := True;

Button11.Enabled := True;

Button12.Enabled := True;

Button13.Enabled := True;

Button14.Enabled := True;

Button15.Enabled := True;

Button16.Enabled := True;

Button17.Enabled := True;

Button18.Enabled := True;

Button19.Enabled := True;

Button20.Enabled := True;

Button23.Enabled := True;

Button24.Enabled := True;

Button25.Enabled := True;

Button26.Enabled := True;

Image1.Visible := True;

Image2.Visible := True;

Image3.Visible := True;

Image4.Visible := True;

Image5.Visible := True;

Image6.Visible := True;

Image7.Visible := True;

Edit1.Text := '';

Edit2.Text := '';

Edit3.Text := '';

Edit4.Text := '';

Edit5.Text := '';

Edit7.Text := '';

StatusBar1.Panels[0].Text := '';

StatusBar1.Panels[1].Text := '';

CreateLists;

q := ListBegin;

qTwo := ListTwoBegin;

while q <> nil do

begin

Edit1.Text := Edit1.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

Image1.Left := 9;

ListPos := 0;

while qTwo <> nil do

begin

Edit2.Text := Edit2.Text + ' ' + IntToStr(qTwo^.Info);

qTwo := qTwo^.Next;

end;

Image2.Left := 9;

ListTwoPos := 0;

FlagList := True;

while QueueBegin <> nil do

begin

Info := GetQueue(QueueBegin);

Edit3.Text := Edit3.Text + ' ' + IntToStr(Info);

AddToQueue(Info, qQueue);

if FlagList then

begin

FlagList := False;

rQueue := qQueue;

end;

end;

QueueBegin := rQueue;

QueuePos := 2;

Image3.Left := 9;

while Stack <> nil do

begin

Info := GetStack(Stack);

Edit4.Text := Edit4.Text + ' ' + IntToStr(Info);

AddToStack(Info, qStack);

end;

Stack := qStack;

Memo1.Lines.Add('В стеке числа идут на оборот т.к. элементы считываются из конца стека.');

StackPos := 2;

Image4.Left := 9;

while DeckEnd <> nil do

begin

Info := GetDeckEnd(DeckEnd);

Edit5.Text := Edit5.Text + ' ' + IntToStr(Info);

AddToDeck(Info, qDeckBegin, qDeckEnd, 0);

end;

DeckBegin := qDeckBegin;

DeckEnd := qDeckEnd;

DeckBeginPos := 2;

Image5.Left := 9;

Memo1.Lines.Add('Дек прочитывался с начала, поэтому элементы записались по порядку.');

DeckEndPosition := 1;

while Edit5.Text[DeckEndPosition] <> '' do Inc(DeckEndPosition);

Image6.Left := Round(9 + DeckEndPosition * 6.2);

Dec(DeckEndPosition);

DeckEndPos := DeckEndPosition;

qRoundList := RoundList^.Next;

Edit7.Text := ' ' + IntToStr(RoundList^.Info);

while qRoundList <> RoundList do

begin

Edit7.Text := Edit7.Text + ' ' + IntToStr(qRoundList^.Info);

qRoundList := qRoundList^.Next;

end;

Image7.Left := 9;

RoundListPos := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form3.Show;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

StatusBar1.Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В однонаправленном списке нельзя перемещаться назад, т.к. связь существует толко в одну сторону;');

end;

procedure TForm1.Button4Click(Sender: TObject);

var

qList: List;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qList := ListBegin;

i := 0;

while i <> ListPos do

begin

qList := qList^.Next;

Inc(i);

end;

if qList <> nil then

begin

if qList^.Next <> nil then Inc(ListPos);

i := 0;

j := 0;

while i < ListPos do

begin

Inc(j);

if Edit1.Text[j] = ' ' then Inc(i);

end;

Image1.Left := Round(9 + (j + 1) * 7.5);

end;

end;

procedure TForm1.Button7Click(Sender: TObject);

var

qListTwo: ListTwo;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qListTwo := ListTwoBegin;

i := 0;

if ListTwoPos <> 0 then dec(ListTwoPos);

i := 0;

j := 0;

while i < ListTwoPos do

begin

Inc(j);

if Edit2.Text[j] = ' ' then Inc(i);

end;

if ListTwoPos = 0 then Image2.Left := 9

else Image2.Left := Round(9 + (j + 1) * 7.5);

end;

procedure TForm1.Button8Click(Sender: TObject);

var

qListTwo: ListTwo;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qListTwo := ListTwoBegin;

i := 0;

while i <> ListTwoPos do

begin

qListTwo := qListTwo^.Next;

Inc(i);

end;

if qListTwo <> nil then

begin

if qListTwo^.Next <> nil then Inc(ListTwoPos);

i := 0;

j := 0;

while i < ListTwoPos do

begin

Inc(j);

if Edit2.Text[j] = ' ' then Inc(i);

end;

Image2.Left := Round(9 + (j + 1) * 7.5);

end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DestroyList(ListBegin);

DestroyListTwo(ListTwoBegin);

DestroyList(QueueBegin);

DestroyList(Stack);

DestroyListTwo(DeckBegin);

Application.Terminate;

end;

procedure TForm1.Button15Click(Sender: TObject);

begin

StatusBar1.Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В стеке нельзя возвращаться в начало т.к. указатель указывает сразу на начало;');

end;

procedure TForm1.Button16Click(Sender: TObject);

var

i: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetStack(Stack);

if Stack <> nil then

begin

while Edit4.Text[StackPos] <> ' ' do Inc(StackPos);

Inc(StackPos);

s := Edit4.Text;

for i := 1 to StackPos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit4.Text := s;

end

else

begin

ShowMessage('Стек пуст');

Edit4.Text := '';

Image4.Hide;

Button14.Enabled := False;

Button15.Enabled := False;

Button16.Enabled := False;

StatusBar1.Panels[1].Text := 'Стек пуст';

end;

Image4.Left := Round(StackPos * 7);

end;

procedure TForm1.Button20Click(Sender: TObject);

var

i: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetDeckBegin(DeckBegin);

if DeckBegin <> nil then

begin

while Edit5.Text[DeckBeginPos] <> ' ' do Inc(DeckBeginPos);

Inc(DeckBeginPos);

s := Edit5.Text;

for i := 1 to DeckBeginPos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit5.Text := s;

end;

if (DeckBegin = nil) and (DeckBegin = DeckEnd) then

begin

ShowMessage('Дек пуст');

Edit5.Text := '';

Image5.Hide;

Image6.Hide;

Button18.Enabled := False;

Button19.Enabled := False;

Button20.Enabled := False;

StatusBar1.Panels[1].Text := 'Дек пуст';

end;

Image5.Left := Round(DeckBeginPos * 7);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Windows.SetFocus(Button21.Handle);

end;

procedure TForm1.Button19Click(Sender: TObject);

var

i, a: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetDeckEnd(DeckEnd);

if DeckEnd <> nil then

begin

while Edit5.Text[DeckEndPos] <> ' ' do Dec(DeckEndPos);

Dec(DeckEndPos);

s := Edit5.Text;

for i := DeckEndPosition downto DeckEndPos + 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit5.Text := s;

//удаляем все пробелы конце строки

s := '';

i := Length(Edit5.Text) - 1;

while Edit5.Text[i] = ' ' do Dec(i);

for a := 1 to i do s := s + Edit5.Text[a];

Edit5.Text := s;

end;

if (DeckEnd = nil) and (DeckBegin = DeckEnd) then

begin

ShowMessage('Дек пуст');

Edit5.Text := '';

Image5.Hide;

Image6.Hide;

Button19.Enabled := False;

Button20.Enabled := False;

StatusBar1.Panels[1].Text := 'Дек пуст';

end;

Image6.Left := Round(DeckEndPos * 7 - 9);

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Form5.Show;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

DeleteFromList(ListPos);

DoNewEditList;

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

DeleteFromListTwo(ListTwoPos);

DoNewEditListTwo;

end;

procedure TForm1.Button10Click(Sender: TObject);

var

i, a: Integer;

s1, s2: string;