Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
mckot
0 / 0 / 0
Регистрация: 21.11.2016
Сообщений: 5
1

Очистка очереди

22.11.2016, 19:05. Просмотров 221. Ответов 3
Метки нет (Все метки)

Как с помощью Button5 очистить всю очередь?
Очередь.rar

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  //Тип основных данных.
  TData = String;
  //Указатель на элемент списка (это элемент очереди).
  TPElem = ^TElem;
  //Элемент списка.
  TElem = record
    Data : TData; //Основные данные.
    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; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := PElem
  else
    aQueue.PLast^.PNext := PElem
  ;
  aQueue.PLast := PElem;
end;
 
//Изъятие элемента из начала очереди.
//Если очередь не пуста, то из её начала изымается элемент и возвращается
//через параметр aData. В этом случае, функция возвращает значение True.
//Если очередь пуста, то операция отменяется, а функция возвращает значение False.
function QueuePop(var aQueue : TQueue; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Result := False;
  if aQueue.PFirst = nil then Exit;
 
  PElem := aQueue.PFirst;
  aData := PElem^.Data;
  aQueue.PFirst := PElem^.PNext;
  if aQueue.PFirst = nil then aQueue.PLast := nil;
  Dispose(PElem);
  Result := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
  Data : TData;
begin
  while QueuePop(aQueue, Data) do;
end;
 
//Распечатка очереди.
function QueueToStr(var aQueue : TQueue) : String;
var
  QTmp : TQueue;
  Data : TData;
begin
  if aQueue.PFirst = nil then begin
    Result := 'Очередь пуста.';
    Exit;
  end;
  Result := '';
 
  //Инициализация вспомогательной очереди.
  QueueInit(QTmp);
  //Переливаем элементы из исходной очереди во временную и при этом
  //выполняем распечатку.
  while QueuePop(aQueue, Data) do begin
    QueuePush(QTmp, Data);
    if Result <> '' then Result := Result + ', ';
    Result := Result + Data;
  end;
 
  aQueue := QTmp;
end;
 
var
  //Очередь.
  Q : TQueue;
 
//Обработчик события, которое возникает сразу после создания формы.
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Начальная инициализация очереди.
  QueueInit(Q);
end;
 
//Обработчик события, которое возникает перед уничтожением формы.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Удаление очереди из памяти.
  QueueFree(Q);
end;
 
//Добавление элемента в конец очереди.
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
begin
  S := Edit1.Text;
  if S = '' then begin
    ShowMessage('Пустая строка не будет добавлена в очередь. Действие отменено.');
    Exit;
    Edit1.Text:='';
  end;
  QueuePush(Q, S);
  Memo1.Lines.Add('В конец очереди добавлен элемент: ' + S);
  Edit1.Clear;
end;
 
//Изъятие элемента из начала очереди.
procedure TForm1.Button2Click(Sender: TObject);
var
  S : String;
begin
  if QueuePop(Q, S) then
    Memo1.Lines.Add('Из начала очереди удалён элемент: ' + S)
  else
    ShowMessage('Очередь пуста. Действие отменено.');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Lines.Add('Очередь (начало - конец):');
  Memo1.Lines.Add(QueueToStr(Q));
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
 
end;
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 19:05
Ответы с готовыми решениями:

В первой очереди найти максимальный элемент и за ним вставить элементы второй очереди
задание:Создать две очереди из случайных целых чисел. В первой найти...

Заменить по очереди три слова test по очереди тремя строками из переменной Arr.Text
Есть 3 строки в переменной Arr.Text (переменная типа TStringList) Есть 3 слова...

Очистка
Как очистить панель ПОЛНОСТЬЮ не через Panel.Caption:=' '; ???

Очистка памяти
Здравствуйте! Скажите пожалуйста, как очищать память после вычислений,если...

Очистка radiobutton
Можно ли как то очищать RadioButton? Ну к примеру как мы очищаем поле:...

3
krapotkin
3419 / 3026 / 1047
Регистрация: 14.04.2014
Сообщений: 14,683
Записей в блоге: 15
23.11.2016, 07:35 2
тут слегка перемешано ООП и процедурное программирование
Если у нас есть класс TQueue и процедуры QueuePush, QueueInit, QueuePop...
то в сумме это должно быть так
Delphi
1
2
3
4
5
6
7
8
9
10
TQueue=class
public
  First:TData;
  Last:TData;
  procedure Init;
  procedure Push(aData: TData);
  function Pop:TData;
  ...
  procedure Clear; // сейчас это QueueFree
end;
соответственно
Delphi
1
2
3
4
procedure TForm1.B5Click(..);
begin
  Q.clear;
end;
0
mckot
0 / 0 / 0
Регистрация: 21.11.2016
Сообщений: 5
23.11.2016, 18:15  [ТС] 3
Не особо разобрался где и что поправить мне нужно...
0
krapotkin
3419 / 3026 / 1047
Регистрация: 14.04.2014
Сообщений: 14,683
Записей в блоге: 15
23.11.2016, 21:36 4
процесс всегда похож
в отдельном месте создаем модель данных и инструменты для работы с ней
новый юнит MyQueue:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
unit MyQueue;
 
interface
uses classes;
 
type
 
TData=class
public
  s:string;
  next:TData;
end;
 
TMyQueue=class
public
  First:TData;
  Last:TData;
  constructor Create;
  destructor Destroy; override;
  procedure Push(s:string);
  function Pop:TData;
  procedure Clear;
  function AsString:string;
  procedure Output(L:TStrings);
end;
 
 
implementation
 
 
{ TMyQueue }
 
function TMyQueue.AsString: string;
var
  t:TData;
begin
  result := '';
  t:=First;
  while T<>NIL do
  begin
    if result<>'' then
      result := result + ',';
    result := Result + t.s;
    t:=t.next;
  end;
end;
 
procedure TMyQueue.Clear;
var
  d:TData;
begin
  while First<>NIL do
  begin
    d:=Pop;
    if (d<>NIL) then
      d.Free;
  end;
end;
 
constructor TMyQueue.Create;
begin
  First:=nil;
  Last:=nil;
end;
 
destructor TMyQueue.Destroy;
begin
  Clear;
  inherited;
end;
 
procedure TMyQueue.Output(L: TStrings);
var d:TData;
begin
  d:=First;
  l.Clear;
  while d<>NIL do
  begin
    l.add(d.s);
    d:=d.next;
  end;
end;
 
function TMyQueue.Pop: TData;
var
  t:TData;
begin
  result := First;
  if First=nil then
    exit;
 
  if (First=Last) then
  begin
    first:=nil;
    last:=nil;
  end
  else
  begin
    First:=First.next;
  end;
end;
 
procedure TMyQueue.Push(s:string);
var
  d:TData;
begin
  d:=TData.Create;
  d.s:=s;
 
  if First=nil then
  begin
    First:=d;
    Last:=d;
  end
  else
  begin
    Last.next := d;
    last := d;
  end;
end;
 
end.

потом в модуле с формой делаем Uses MyQueue
и в классе формы заводим и инициализируем поле класса TMyQueue
а потом остается только по каждой кнопке выполнять действия с моделью данных

Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls,
  MyQueue;
 
type
  TForm1 = class(TForm)
    m1: TMemo;
    e1: TEdit;
    bPush: TButton;
    bPop: TButton;
    bClear: TButton;
    bAsString: TButton;
    m2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bPushClick(Sender: TObject);
    procedure bPopClick(Sender: TObject);
    procedure bClearClick(Sender: TObject);
    procedure bAsStringClick(Sender: TObject);
  private
  public
    Q: TMyQueue;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.bAsStringClick(Sender: TObject);
begin
  m2.Lines.Text := q.AsString;
end;
 
procedure TForm1.bClearClick(Sender: TObject);
begin
  q.Clear;
  q.Output(m1.Lines);
end;
 
procedure TForm1.bPopClick(Sender: TObject);
var
  d:TData;
begin
  d:=q.Pop;
  if (d<>NIL) then
    d.Free;
  q.Output(m1.Lines);
end;
 
procedure TForm1.bPushClick(Sender: TObject);
begin
  if e1.Text<>'' then
    q.Push(e1.Text);
  q.Output(m1.Lines);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  q:=TMyQueue.Create;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(q);
end;
 
end.
0
Миниатюры
Очистка очереди  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 21:36

Очистка автозагрузки
помогите с кодом, для удаления всех параметров из HKEY_CURRENT_USER\...

Edit2 очистка
Здрасте:D Возникла такая проблема: Не могу очистить поле Edit2 в программе...

Очистка Edit
Как сделать чтобы, при возвращении с Form2 на Form1, Editы очищались?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru