Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Unit Unit2;
- Interface
- Uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
- Type
- TFormAddElement = class(TForm)
- Label1: TLabel;
- EditAdd: TEdit;
- ButtonOK: TButton;
- Procedure ButtonOKClick(Sender: TObject);
- Procedure FormClose(Sender: TObject; var Action: TCloseAction);
- Private
- Public
- end;
- Type
- SinglyLinkedList = class
- Type PNode = ^TNode; { указатель на узел }
- TNode = record { структура узла }
- Element: Integer; { элемент }
- Index: Word; { индекс узла }
- NextNode: PNode; { ссылка на следующий }
- End;
- Private
- FHeaderNode: PNode;
- FLastNode: PNode;
- Function IsEmpty: Boolean;
- Function GetSize: Word;
- Function NodeDataWithIndex(AIndex: Word): TNode;
- Public
- Constructor Create;
- Destructor Destroy;
- Procedure Append(ANodeElement: Integer);
- Procedure ShowCountElementEnter(Element: Word);
- Procedure Clear;
- Function PopLast: Integer;
- Procedure Remove(AIndex: Word);
- Procedure Debug;
- End;
- Var
- FormAddElement: TFormAddElement;
- List: SinglyLinkedList;
- IsDeleteble: Boolean = False;
- IsAdd: Boolean = False;
- IsEnter: Boolean = False;
- Count: Integer = 1;
- Implementation
- Uses Unit1;
- Procedure SinglyLinkedList.Debug();
- Var
- CurNode: PNode;
- Begin
- CurNode := FHeaderNode^.NextNode;
- While CurNode <> Nil do
- Begin
- ShowMessage(IntToStr(CurNode^.Element));
- CurNode := CurNode^.NextNode;
- End;
- End;
- Function SinglyLinkedList.IsEmpty: Boolean;
- Begin
- if FHeaderNode^.NextNode = Nil then
- IsEmpty := True
- else
- IsEmpty := False;
- End;
- Procedure SinglyLinkedList.ShowCountElementEnter(Element: Word);
- Var
- Count, I: Word;
- Begin
- Count := 0;
- I := 0;
- While I < GetSize do
- Begin
- if (Element = NodeDataWithIndex(I).NextNode.Element) then
- Inc(Count);
- Inc(I);
- End;
- ShowMessage('Количество вхождений элемента ' + IntToStr(Element) + ' в список = '+ IntToStr(Count));
- End;
- Function SinglyLinkedList.GetSize: Word;
- Var
- CurrentNode: TNode;
- Begin
- If IsEmpty then
- GetSize := 0
- Else
- Begin
- CurrentNode.NextNode := FHeaderNode^.NextNode;
- CurrentNode.Index := 0;
- While CurrentNode.NextNode <> Nil do
- Begin
- CurrentNode.NextNode := CurrentNode.NextNode^.NextNode;
- Inc(currentNode.Index);
- End;
- GetSize := CurrentNode.Index;
- End;
- End;
- Constructor SinglyLinkedList.Create();
- Begin
- New(FHeaderNode);
- FHeaderNode^.NextNode := Nil;
- FLastNode := FHeaderNode;
- End;
- Destructor SinglyLinkedList.Destroy;
- Begin
- Clear;
- Dispose(FHeaderNode);
- End;
- Function SinglyLinkedList.NodeDataWithIndex(AIndex: Word): TNode;
- Var
- CurrentData: TNode;
- Begin
- CurrentData.NextNode := FHeaderNode^.NextNode;
- CurrentData.Index := 0;
- While CurrentData.Index <> AIndex do
- Begin
- CurrentData.NextNode := CurrentData.NextNode^.NextNode;
- Inc(CurrentData.Index);
- End;
- NodeDataWithIndex := CurrentData;
- End;
- Procedure SinglyLinkedList.Append(ANodeElement: Integer);
- Var
- CurrentNode: PNode;
- Begin
- CurrentNode := FLastNode;
- New(CurrentNode^.NextNode);
- CurrentNode := CurrentNode^.NextNode;
- CurrentNode^.Element := ANodeElement;
- CurrentNode^.NextNode := Nil;
- FLastNode := CurrentNode;
- End;
- Procedure SinglyLinkedList.Clear;
- Begin
- While FHeaderNode^.NextNode <> Nil do
- PopLast;
- End;
- Function SinglyLinkedList.PopLast: Integer;
- Var
- I: Word;
- CurrentNode: PNode;
- Begin
- If FHeaderNode^.NextNode <> Nil then
- Begin
- CurrentNode := FHeaderNode;
- While CurrentNode^.NextNode <> FLastNode do
- CurrentNode := CurrentNode^.NextNode;
- PopLast := FLastNode^.Element;
- Dispose(CurrentNode^.NextNode);
- FLastNode := CurrentNode;
- FLastNode^.NextNode := Nil;
- End;
- End;
- Procedure SinglyLinkedList.Remove(AIndex: Word);
- Var
- CurrentData: TNode;
- BuffLastNode: PNode;
- Begin
- If AIndex = 0 then
- Begin
- CurrentData.NextNode := FHeaderNode;
- CurrentData.Index := 0;
- End
- Else
- CurrentData := NodeDataWithIndex(AIndex - 1);
- If AIndex = GetSize-1 then
- PopLast
- Else
- Begin
- BuffLastNode := FLastNode;
- FLastNode := CurrentData.NextNode^.NextNode;
- CurrentData.NextNode^.NextNode := FLastNode^.NextNode;
- FLastNode := BuffLastNode;
- End;
- End;
- {$R *.dfm}
- Function IsElementCorrect(EditAdd:TEdit):Boolean;
- Var
- IsCorrect: Boolean;
- Begin
- IsCorrect := True;
- Try
- StrToInt(EditAdd.Text)
- Except
- IsCorrect := False;
- End;
- IsElementCorrect := IsCorrect;
- End;
- Procedure TFormAddElement.ButtonOKClick(Sender: TObject);
- Var
- Element: Integer;
- Begin
- If IsAdd then
- Begin
- If count = 1 then
- Begin
- List := SinglyLinkedList.Create();
- IsDeleteble := True;
- End;
- If IsElementCorrect(EditAdd) then
- Begin
- Element := StrToInt(EditAdd.Text);
- ListForm.StringGrid1.Cells[1,count] := EditAdd.Text;
- ListForm.StringGrid1.Cells[0,count] := IntToStr(Count);
- ListForm.StringGrid1.RowCount := ListForm.StringGrid1.RowCount + 1;
- List.Append(Element);
- Inc(Count);
- EditAdd.Text := '';
- IsAdd := False;
- FormAddElement.Close;
- End
- Else
- MessageDlg('Введите целое число в пределах +- 2*10^9!', mtError, [mbOK], 0)
- End;
- If IsEnter then
- Begin
- If IsElementCorrect(EditAdd) then
- Begin
- Element := StrToInt(EditAdd.Text);
- List.ShowCountElementEnter(Element);
- //ShowMessage(IntToStr(List.ShowCountElementEnter(Element)));
- IsEnter := False;
- FormAddElement.Close;
- End;
- End;
- End;
- Procedure TFormAddElement.FormClose(Sender: TObject; var Action: TCloseAction);
- Begin
- IsEnter := False;
- IsAdd := False;
- EditAdd.Text := '';
- End;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement