44905 (Линейные списки. Стек. Дек. Очередь), страница 7
Описание файла
Документ из архива "Линейные списки. Стек. Дек. Очередь", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "44905"
Текст 7 страницы из документа "44905"
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;
begin
GetQueue(QueueBegin);
if QueueBegin <> nil then
begin
i := QueuePos;
while (Edit3.Text[i] <> ' ') and (i <= Length(Edit3.Text)) do Inc(i);
Inc(i);
s1 := '';
s2 := '';
for a := 1 to QueuePos - 1 do s1 := s1 + Edit3.Text[a];
for a := i to Length(Edit3.Text) do s2 := s2 + Edit3.Text[a];
Edit3.Text := s1 + s2;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
Form4.Show;
end;
procedure TForm1.Button14Click(Sender: TObject);
var
i, a: Integer;
s1, s2: string;
begin
GetStack(Stack);
i := StackPos;
while (Edit4.Text[i] <> ' ') and (i <= Length(Edit4.Text)) do Inc(i);
Inc(i);
s1 := '';
s2 := '';
for a := 1 to StackPos - 1 do s1 := s1 + Edit4.Text[a];
for a := i to Length(Edit4.Text) do s2 := s2 + Edit4.Text[a];
Edit4.Text := s1 + s2;
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
Form6.Show;
end;
procedure TForm1.Button17Click(Sender: TObject);
begin
Form7.Show;
end;
procedure TForm1.Button18Click(Sender: TObject);
begin
Form8.Show;
end;
procedure TForm1.Button26Click(Sender: TObject);
begin
StatusBar1.Panels[0].Text := 'Нельзя !!!';
Memo1.Lines.Add('В цикл. списке нельзя перемещаться назад, т.к. по сути цикл. список это однонаправ. список и следовательно связь существует только в одну сторону;');
end;
procedure TForm1.Button25Click(Sender: TObject);
var
qRoundList: List;
i, j: Integer;
Count: Integer;
begin
StatusBar1.Panels[0].Text := '';
qRoundList := RoundList^.Next;
// Подсчет кол-ва елементов в списке
Count := 1;
while qRoundList <> RoundList do
begin
Inc(Count);
qRoundList := qRoundList^.Next;
end;
qRoundList := RoundList;
i := 0;
while i <> RoundListPos do
begin
qRoundList := qRoundList^.Next;
Inc(i);
end;
if qRoundList <> nil then
begin
if qRoundList^.Next <> nil then Inc(RoundListPos);
if RoundListPos > Count - 1 then RoundListPos := 0;
i := 0;
j := 0;
while i < RoundListPos do
begin
Inc(j);
if Edit7.Text[j] = ' ' then Inc(i);
end;
if RoundListPos = 0 then j := -1;
Image7.Left := Round(9 + (j + 1) * 7.5);
end;
end;
procedure TForm1.Button23Click(Sender: TObject);
begin
Form9.Show;
end;
procedure TForm1.Button24Click(Sender: TObject);
begin
if RoundList <> nil then
begin
DeleteFromRoundList(RoundListPos);
if RoundList <> nil then DoNewEditRoundList;
end
else
begin
Edit7.Text := '';
ShowMessage('Циклический список пуст');
Button24.Enabled := False;
Button25.Enabled := False;
Button26.Enabled := False;
Image7.Hide;
end;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
AboutBox.Visible := True;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Form10.Visible := True;
end;
procedure TForm1.Button27Click(Sender: TObject);
begin
Form11.Show;
end;
procedure TForm1.Button30Click(Sender: TObject);
begin
Form12.Show;
end;
procedure TForm1.Button29Click(Sender: TObject);
begin
Form13.Show;
end;
procedure TForm1.Button31Click(Sender: TObject);
begin
Form14.Show;
end;
procedure TForm1.Button32Click(Sender: TObject);
begin
Form15.Show;
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Form1.Hide;
Form16.Show;
N8.Enabled := False;
end;
procedure TForm1.N11Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №1.');
Memo1.Lines.Add(' "Списки"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для получения информации о списках.');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы.');
Memo1.Lines.Add(' 1) Что такое линейный список?');
Memo1.Lines.Add(' 2) Какие операции можно выполнить с линейным списком?');
Memo1.Lines.Add(' 3) Какие существую еще списки?');
Memo1.Lines.Add(' 4) Что представляет из себя связанное распределение?');
Memo1.Lines.Add(' 5) Чем отличается связанное распределение от последовательного?');
Memo1.Lines.Add(' 6) Что такое динамические переменные? Функции new и nil.');
end;
procedure TForm1.Button33Click(Sender: TObject);
begin
Form17.Show;
end;
procedure TForm1.N21Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №2.');
Memo1.Lines.Add(' "Однонаправленный и двунаправленный список"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для однонаправленного и ');
Memo1.Lines.Add(' двунаправленного списка.');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');
Memo1.Lines.Add(' Кнопки "<>" служат для перемещения курсора по списку.');
Memo1.Lines.Add(' а) Переместитесь влево до 3, 5 и последнего элемента;');
Memo1.Lines.Add(' б) Переместитесь вправо до первого элемента (см. коментарии);');
Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в список.');
Memo1.Lines.Add(' а) Добавьте после 3, 5, 7 элемента цифру 33 в обоих списках;');
Memo1.Lines.Add(' б) Добавте 1-м и 3-м элементом цифру 55 в двунаправленном списке;');
Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из списка.');
Memo1.Lines.Add(' а) Удалите 3, 5, 7 элементы в однонаправленном списке;');
Memo1.Lines.Add(' б) Удалите последний, 1 и 3 элементы в двунаправленном;');
Memo1.Lines.Add('');
Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы:');
Memo1.Lines.Add(' 1) Обратите внимание как перемещается курсор?');
Memo1.Lines.Add(' 2) Чем отличается однонаправленный и двунаправленный списки?');
Memo1.Lines.Add(' 3) Можно ли добавить элемент в любое место списка?');
Memo1.Lines.Add(' 4) Можно ли удалить любой элемент из списка?');
end;
procedure TForm1.N31Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №3.');
Memo1.Lines.Add(' "Циклический список"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для циклического списка?');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');
Memo1.Lines.Add(' Кнопки "<>" служат для перемещения курсора по списку.');
Memo1.Lines.Add(' а) Переместитесь вправо до 3, 5, последнего, первого элемента;');
Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');
Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в список.');
Memo1.Lines.Add(' а) Добавьте 3, 5, 1-м элементами число 44;');
Memo1.Lines.Add(' б) Добавьте после 2, 4, 1-го элемента число 0;');
Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из списка.');
Memo1.Lines.Add(' Удалите 3, 5, 1, 4 элементы;');
Memo1.Lines.Add('');
Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы:');
Memo1.Lines.Add(' 1) Обратите внимание как перемещается курсор?');
Memo1.Lines.Add(' 2) Какую ссылку имеет последний элемент циклического списка?');
Memo1.Lines.Add(' 3) Что называется головой и хвостом списка?');
end;
procedure TForm1.N41Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №4.');
Memo1.Lines.Add(' "Очередь"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для очереди.');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');
Memo1.Lines.Add(' Кнопки "<>" служат для перемещения курсора по очереди.');
Memo1.Lines.Add(' а) Переместитесь вправо до 3 элемента;');
Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');
Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в очередь.');
Memo1.Lines.Add(' а) Добавьте 1, 4, 5-м элементами число 99;');
Memo1.Lines.Add(' б) Добавьте последним число 999;');
Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из очереди.');
Memo1.Lines.Add(' Удалите 1, 2, 3 элементы;');
Memo1.Lines.Add('');
Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы:');
Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в очереди?');
Memo1.Lines.Add(' 2) В чем различие и сходство очереди и однонаправленного списка?');
Memo1.Lines.Add(' 3) Что называется головой и хвостом очереди?');
Memo1.Lines.Add(' 4) Как располагаются элементы в очереди?');
end;
procedure TForm1.N51Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №5.');
Memo1.Lines.Add(' "Стек"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для стека.');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');
Memo1.Lines.Add(' Кнопки "<>" служат для перемещения курсора в стеке.');
Memo1.Lines.Add(' а) Переместитесь вправо до 4 элемента;');
Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');
Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в стек.');
Memo1.Lines.Add(' Добавьте 1, 3, 5 элементами число 22;');
Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из стека.');
Memo1.Lines.Add(' Удалите 1, 3, 5, последний элементы;');
Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы:');
Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в стек?');
Memo1.Lines.Add(' 2) Приведи примеры стека на практике?');
end;
procedure TForm1.N61Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №6.');
Memo1.Lines.Add(' "Дек"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Нажмите кнопку "Теория" для дека.');
Memo1.Lines.Add(' Внимательно изучите теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');
Memo1.Lines.Add(' Кнопки "<>" служат для перемещения курсора в деке.');
Memo1.Lines.Add(' а) Переместитесь влево на 2 элемента;');
Memo1.Lines.Add(' б Переместитесь вправо на 4 элемента;');
Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в дек.');
Memo1.Lines.Add(' а) Добавьте 1, 3 элементом число 11;');
Memo1.Lines.Add(' б) Добавьте 5, 6 элементом число 88;');
Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из дека.');
Memo1.Lines.Add(' а) Удалите 2, 4 элементы;');
Memo1.Lines.Add(' б) Добавте 6, 7 элементы;');
Memo1.Lines.Add('');
Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');
Memo1.Lines.Add(' Ответьте на поставленные вопросы:');
Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в дек?');
Memo1.Lines.Add(' 2) В чем сходны и различны дек, стек и двунаправленный список?');
end;
procedure TForm1.N71Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(' Лабораторная работа №7.');
Memo1.Lines.Add(' "Тест"');
Memo1.Lines.Add('______________________________________________________________');
Memo1.Lines.Add('1. Повторите весь теоретический материал.');
Memo1.Lines.Add('');
Memo1.Lines.Add('2. Поработайте с демонстрационной программой.');
Memo1.Lines.Add('');
Memo1.Lines.Add('3. Запустите тест (сервис\тест или Ctrl + T).');
Memo1.Lines.Add(' Ответьте на поставленные вопросы теста.');
Memo1.Lines.Add('');
Memo1.Lines.Add('4. Результаты теста сообщить преподавателю.');
end;
procedure TForm1.N9Click(Sender: TObject);
begin
Form18.Show;
end;
end.
unit Unit2; //Формирование списков
interface
uses SysUtils, Windows, Dialogs;
type
List = ^Spisok; //Однонаправленный
Spisok = record
Info: Integer;
Next: List;
end;
ListTwo = ^SpisokTwo; //Двунаправленный
SpisokTwo = record
Info: Integer;
Next: ListTwo;
Prev: ListTwo;
end;
procedure CreateLists;
procedure AddToList(X: Integer; var PointerEndList: List);
procedure AddToListAfterPos(X: Integer; Position: Integer);
procedure DeleteFromList(Position: Integer);
procedure AddToListTwo(X: Integer; var PointerEndListTwo: ListTwo);
procedure AddToListTwoAfterPos(X: Integer; Position: Integer);
procedure DeleteFromListTwo(Position: Integer);
procedure AddToQueue(X: Integer; var PointerEndQueue: List);
procedure AddToEndQueue(X: Integer);
function GetQueue(var PointerBegin: List): Integer;
procedure AddToStack(X: Integer; var PointerStack: List);
function GetStack(var PointerStack: List): Integer;
procedure AddToDeck(X: Integer;
var PointerDeckBegin, PointerDeckEnd: ListTwo; Flag: Integer);
function GetDeckBegin(var PointerDeckBegin: ListTwo): Integer;
function GetDeckEnd(var PointerDeckEnd: ListTwo): Integer;
procedure DestroyList(PointerBegin: List);
procedure DestroyListTwo(PointerBegin: ListTwo);
procedure AddToRoundList(X: Integer; var PointerRoundList: List);
procedure DeleteFromRoundList(Position: Integer);
procedure DestroyRoundList(var PointerRoundList: List);
implementation
uses Unit1;
procedure DestroyList(PointerBegin: List);
var
q: List;
begin
while PointerBegin <> nil do
begin
q := PointerBegin;
PointerBegin := PointerBegin^.Next;
if q <> nil then Dispose(q);
end;
end;
procedure DestroyListTwo(PointerBegin: ListTwo);
var
q: ListTwo;
begin
while PointerBegin <> nil do
begin
q := PointerBegin;
PointerBegin := PointerBegin^.Next;
if q <> nil then Dispose(q);
end;
end;
procedure DestroyRoundList(var PointerRoundList: List);
var
q, t: List;
begin
q := PointerRoundList^.Next;
PointerRoundList^.Next := nil;
while q <> nil do
begin
t := q;
q := q^.Next;
if t <> nil then Dispose(t);
end;
PointerRoundList := nil;
end;
procedure AddToList(X: Integer; var PointerEndList: List); //Добавить элемент в
//конец списка (PointerEnd - указатель на последний элемент списка)
begin
if PointerEndList = nil then // Если первый элемент еще не существует
begin
New(PointerEndList);
PointerEndList^.Info := X;
PointerEndList^.Next := nil;
end
else
begin
New(PointerEndList^.Next);
PointerEndList := PointerEndList^.Next;
PointerEndList^.Info := X;
PointerEndList^.Next := nil;
end;
end;
procedure AddToListAfterPos(X: Integer; Position: Integer);
var //Добавить элемент в список после Position
i: Integer;
q, qNew: List;
begin
if Position = 0 then // Если позиция = 0, то добавляем в начало
begin
New(qNew);
qNew^.Info := X;
qNew^.Next := ListBegin;
ListBegin := qNew;
end
else
begin
q := ListBegin;
i := 0;
while (i < Position) and (q <> nil) do // Ищем элемент после которого
// нужно вставить
begin
q := q^.Next;
Inc(i);
end;
if q <> nil then // Если элемент существует то вставляем
begin
New(qNew);
qNew^.Info := X;
qNew^.Next := q^.Next;
q^.Next := qNew;
end
else ShowMessage('Элемент, после которого хотите вставить, удален');
end;
end;
procedure AddToRoundList(X: Integer; var PointerRoundList: List);
var qRound: List;
begin
if PointerRoundList = nil then
begin
New(PointerRoundList);
PointerRoundList^.Info := X;
PointerRoundList^.Next := PointerRoundList;
RoundList := PointerRoundList;
end
else
begin
New(qRound);
qRound^.Info := X;
qRound^.Next := PointerRoundList^.Next;
PointerRoundList^.Next := qRound;
end;
PointerRoundList := PointerRoundList^.Next;
end;
procedure DeleteFromRoundList(Position: Integer);
var
q, h: List;
i: Integer;
begin
if RoundList^.Next = RoundList then //один элемент в списке
begin
if RoundList <> nil then Dispose(RoundList);
RoundList := nil;
end
else // не один элемент в списке
begin
i := 1;
q := RoundList;
while i < RoundListPos do
begin
Inc(i);
q := q^.Next;
end;
if i <> 1 then
begin
h := q^.Next;
q^.Next := h^.Next;
if h <> nil then Dispose(h);
end
else
begin
q := RoundList^.Next;
while q^.Next <> RoundList do q := q^.Next;
h := q^.Next;
q^.Next := h^.Next;
if h <> nil then Dispose(h);
RoundList := q^.Next;
end;
end;
if RoundList <> nil then
begin
q := RoundList^.Next;
i := 1;
while q <> RoundList do
begin
Inc(i);
q := q^.Next;
end;
if i = RoundListPos then
begin
RoundListPos := 0;
Form1.Image7.Left := 9;
end;
end;
end;
procedure DeleteFromList(Position: Integer); //Удаляет элемент под
//номером Position
var
i: Integer;
q, r: List;
begin
q := ListBegin;
if q <> nil then // Если список не пуст, то
begin
if Position = 0 then //Если позиция = 0, то удаляем первый элемент
begin
ListBegin := q^.Next;
if q <> nil then Dispose(q);
end
else
begin
i := 0;
while (i < Position - 1) and (q <> nil) do //Ищем элемент после
//которого нужно удалить
begin
q := q^.Next;
Inc(i);
end;
r := q^.Next;
if r <> nil then //Если удаляемый элемент существует, то удаляем его
begin
q^.Next := r^.Next;
if r <> nil then Dispose(r);
end
else ShowMessage('Элемент уже не существует');
end;
end
else
begin
ShowMessage('Список пуст');
Form1.Image1.Hide;
end;
end;
procedure AddToListTwo(X: Integer; var PointerEndListTwo: ListTwo); //Добавить элемент в
//конец дв-списка (PointerEnd - указатель на последний элемент списка)
begin
if PointerEndListTwo = nil then //Если список еще не существует или пуст,
//добавляем в начало
begin
New(PointerEndListTwo);
PointerEndListTwo^.Info := X;
PointerEndListTwo^.Next := nil;
PointerEndListTwo^.Prev := nil;
end
else
begin
New(PointerEndListTwo^.Next);
PointerEndListTwo := PointerEndListTwo^.Next;
PointerEndListTwo^.Info := X;
PointerEndListTwo^.Next := nil;
PointerEndListTwo^.Prev := nil;
end;
end;
procedure AddToListTwoAfterPos(X: Integer; Position: Integer);
var //Добавить элемент в двунап. список после Position
i: Integer;
q, qNew: ListTwo;
begin
if Position = 0 then //Если позиция = 0, вставляем в начало
begin
New(qNew);
qNew^.Info := X;
qNew^.Next := ListTwoBegin;
ListTwoBegin := qNew;
end
else
begin
q := ListTwoBegin;
i := 0;
while (i < Position) and (q <> nil) do //Ищем элемент после которого
//нужно вставить
begin
q := q^.Next;
Inc(i);
end;
if q <> nil then // Если элемент существует то вставляем
begin
New(qNew);
qNew^.Info := X;
qNew^.Next := q^.Next;
qNew^.Prev := q;
q^.Next := qNew;
end
else ShowMessage('Элемент, после которого хотите вставить, удален');
end;
end;
procedure DeleteFromListTwo(Position: Integer); //Удаляет элемент
//под номером Position
var
i: Integer;
q, r: ListTwo;
begin
q := ListTwoBegin;
if q <> nil then //Если удаляемый элемент существует, то
begin
if Position = 0 then //Если позиция = 0, то удаляем первый элемент
begin
ListTwoBegin^.Prev := nil;
ListTwoBegin := q^.Next;
if q <> nil then Dispose(q);
end
else
begin
i := 0;
while (i < Position - 1) and (q <> nil) do //Ищем элемент
// после которого нужно удалить
begin
q := q^.Next;
Inc(i);
end;
r := q^.Next;
if r <> nil then //Если он существует, то удаляем его
begin
if r^.Next <> nil then r^.Next^.Prev := q;
q^.Next := r^.Next;
if r <> nil then Dispose(r);
end
else ShowMessage('Элемент уже не существует');
end;
end
else
begin
ShowMessage('Список пуст');
Form1.Image2.Hide;
end;
end;
procedure AddToQueue(X: Integer; var PointerEndQueue: List); //Добавить элемент
//в конец очереди (PointerEnd - указатель на последний элемент очереди)
begin
if PointerEndQueue = nil then //Если очередь еще не существует или пуста
//добавляем в начало
begin
New(PointerEndQueue);
PointerEndQueue^.Info := X;
PointerEndQueue^.Next := nil;
end
else
begin
New(PointerEndQueue^.Next);
PointerEndQueue := PointerEndQueue^.Next;
PointerEndQueue^.Info := X;
PointerEndQueue^.Next := nil;
end;
end;
function GetQueue(var PointerBegin: List): Integer; //ф-ия получает элемент из
// очереди и возвращает указатель на начало очереди
var
rQueue: List;
begin
rQueue := PointerBegin;
if rQueue <> nil then //Если очередь не пуста
begin
PointerBegin := PointerBegin^.Next;
Result := rQueue^.Info;
if rQueue <> nil then Dispose(rQueue);
end
else
begin
ShowMessage('Очередь пуста');
Form1.Edit3.Text := '';
Form1.Button10.Enabled := False;
Form1.Button11.Enabled := False;
Form1.Button12.Enabled := False;
Form1.Image3.Hide;
end;
end;
procedure AddToEndQueue(X: Integer);
var
Info: Integer;
rQueue, qQueue: List;
FlagList: Boolean;
begin
FlagList := True; //Для выделения первого элемента
qQueue := nil;
rQueue := nil;
while QueueBegin <> nil do //Ищем указатель на последний элемент очереди
begin
Info := GetQueue(QueueBegin);
AddToQueue(Info, rQueue); //Формируем новую очередь из элементов старой
//очереди, чтобы не потерять ее
if FlagList then /////////////////////////////////////
begin // //
qQueue := rQueue; // формируем указатель на очередь //
FlagList := False; // //
end; // //////////////////////////////////
end;
AddToQueue(X, rQueue);
if qQueue <> nil then QueueBegin := qQueue // определяем указатель на очередь
else QueueBegin := rQueue; //////////////////////////////////
end;
procedure AddToStack(X: Integer; var PointerStack: List); //Добавить элемент в
//стек (PointerStack - указатель на стек)
var
Stacks: List;
begin
if PointerStack = nil then //Если стек пуст, то формируем его
begin
New(PointerStack);
PointerStack^.Info := X;
PointerStack^.Next := nil;
end
else //иначе добавляем элемент
begin
New(Stacks);
Stacks^.Info := X;
Stacks^.Next := PointerStack;
PointerStack := Stacks;
end;
end;
function GetStack(var PointerStack: List): Integer; //ф-ия получает элемент из
// стека и возвращает указатель на стек
var
rStack: List;
begin
rStack := PointerStack;
if rStack <> nil then //Если стек еще не пуст
begin
PointerStack := PointerStack^.Next;
Result := rStack^.Info;
if rStack <> nil then Dispose(rStack);
end
else
begin
ShowMessage('Стек пуст');
Form1.Button14.Enabled := False;
Form1.Image4.Hide;
end;
end;
procedure AddToDeck(X: Integer; var PointerDeckBegin, PointerDeckEnd: ListTwo;
Flag: Integer); //Добавить элемент в дек
//PointerDeckBegin - указатель на начало дека
//PointerDeckEnd - указатель на конец дека
var
Decks: ListTwo;
begin
if PointerDeckBegin = nil then //Если дек пуст, то формируем его
begin
New(PointerDeckBegin);
PointerDeckBegin^.Info := X;
PointerDeckBegin^.Next := nil;
PointerDeckBegin^.Prev := nil;
PointerDeckEnd := PointerDeckBegin;
end
else //иначе добавляем элемент
begin
if Flag = 0 then //добавляем в начало
begin
New(Decks);
Decks^.Info := X;
Decks^.Next := PointerDeckBegin;
Decks^.Prev := nil;
PointerDeckBegin^.Prev := Decks;
PointerDeckBegin := Decks;
end
else //добавлям в конец
begin
New(Decks);
Decks^.Info := X;
Decks^.Next := nil;
Decks^.Prev := PointerDeckEnd;
PointerDeckEnd^.Next := Decks;
PointerDeckEnd := Decks;
end;
end;
end;
function GetDeckBegin(var PointerDeckBegin: ListTwo): Integer;
//ф-ия получает элемент из начала дека и возвращает указатель на начало дека.
var
q: ListTwo;
begin
if PointerDeckBegin <> nil then //Если дек не пуст
begin
Result := PointerDeckBegin^.Info;
q := PointerDeckBegin;
PointerDeckBegin := q^.Next;
if PointerDeckBegin <> nil then PointerDeckBegin^.Prev := nil;
if q <> nil then Dispose(q);
end
else
begin
ShowMessage('Дек пуст');
Form1.Edit5.Text := '';
Form1.Button18.Enabled := False;
Form1.Button19.Enabled := False;
Form1.Button20.Enabled := False;
Form1.Image5.Hide;
Form1.Image6.Hide;
end;
end;
function GetDeckEnd(var PointerDeckEnd: ListTwo): Integer;
//ф-ия получает элемент из конца дека и возвращает указатель на конец дека.
var
q: ListTwo;
begin
if PointerDeckEnd <> nil then //Если дек не пуст
begin
Result := PointerDeckEnd^.Info;
q := PointerDeckEnd;
PointerDeckEnd := q^.Prev;
if PointerDeckEnd <> nil then PointerDeckEnd^.Next := nil;
if q <> nil then Dispose(q);
end
else
begin
ShowMessage('Дек пуст');
Form1.Edit5.Text := '';
Form1.Button18.Enabled := False;
Form1.Button19.Enabled := False;
Form1.Button20.Enabled := False;
Form1.Image5.Hide;
Form1.Image6.Hide;
end;
end;
procedure CreateLists; //процедура создания всех списков
var
i: Integer;
X: Integer;
Uk, q: List;
UkTwo, qTwo: ListTwo;
UkQueue, qQueue: List;
qStack: List;
qDeckBegin, qDeckEnd: ListTwo;
begin
X := Random(101); //Определяем значение первого элемента
Uk := nil; //////////////////////////
q := nil; // //
UkTwo := nil; // НАЧАЛЬНЫЕ УСТАНОВКИ: //
qTwo := nil; // //
UkQueue := nil; // все указатели = nil //
qQueue := nil; // //
qStack := nil; // //
qDeckBegin := nil; // //
qDeckEnd := nil; //////////////////////////
// Destroy for every lists
if ListBegin <> nil then DestroyList(ListBegin);
if ListTwoBegin <> nil then DestroyListTwo(ListTwoBegin);
if QueueBegin <> nil then DestroyList(QueueBegin);
if Stack <> nil then DestroyList(Stack);
if DeckBegin <> nil then DestroyListTwo(DeckBegin);
if RoundList <> nil then DestroyRoundList(RoundList);
AddToList(X, Uk); //
AddToListTwo(X, UkTwo); // Добавляем Х в
AddToQueue(X, UkQueue); // каждый список
AddToStack(X, qStack); //
AddToDeck(X, qDeckBegin, qDeckEnd, 0); //
AddToRoundList(X, RoundList); ///////////////////
Unit1.Form1.Edit6.Text := IntToStr(X);
q := Uk; //
qTwo := UkTwo; // Формируем указатели на начало списков
qQueue := UkQueue; //
for i := to 9 do //Дальнейшее формирование списков
begin
X := Random(101);
AddToList(X, q);
AddToListTwo(X, qTwo);
AddToQueue(X, qQueue);
AddToStack(X, qStack);
AddToDeck(X, qDeckBegin, qDeckEnd, 0);
AddToRoundList(X, RoundList);
Unit1.Form1.Edit6.Text := Unit1.Form1.Edit6.Text + ' ' + IntToStr(X);
end;
ListBegin := Uk; //////////////////////////////////////
ListTwoBegin := UkTwo; // //
QueueBegin := UkQueue; // //
Stack := qStack; // Определяем указатели все списки //
DeckBegin := qDeckBegin; // //
DeckEnd := qDeckEnd; // //
RoundList := RoundList^.Next //////////////////////////////////
end;
end.
unit Unit16; //Тест
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm16 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
Button1: TButton;
RadioGroup1: TRadioGroup;
Button2: TButton;
procedure RadioGroup1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form16: TForm16;
NumberQuestion: Integer = 0;
NumberTrueAnswer: Integer = 0;
ff: Boolean = True;
implementation
uses Unit1, Un18_Lab;
{$R *.DFM}
procedure TForm16.RadioGroup1Click(Sender: TObject);
begin
Button1.Enabled := True;
Button1.SetFocus;
end;
procedure TForm16.Button2Click(Sender: TObject);
begin
Form16.Hide;
Form1.Show;
end;
procedure TForm16.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
Button1.Enabled := False;
Inc(NumberQuestion);
case NumberQuestion of
1:
begin
if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Однонаправленный список - это ...');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующим и предыдущим элементом');
RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующим элементом');
RadioGroup1.Items.Add('Список, элементы которого не имеют связи');
end;
2:
begin
if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Если элемент содержит ссылки на следующий и предыдущий элемент, то это ...');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('однонаправленный список');
RadioGroup1.Items.Add('двунаправленный список');
RadioGroup1.Items.Add('очередь');
RadioGroup1.Items.Add('стек');
RadioGroup1.Items.Add('дек');
RadioGroup1.Items.Add('циклический список');
end;
3:
begin
if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Куда добавляется элемент в двунаправленный список?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('В начало');
RadioGroup1.Items.Add('В конец');
RadioGroup1.Items.Add('В любое другое место');
end;
4:
begin
if RadioGroup1.ItemIndex = 2 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Чем отличается однонаправленный список от двунаправленного?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('Существует связь с предыдущим элементом');
RadioGroup1.Items.Add('Не существует связь с предыдущим элементом');
RadioGroup1.Items.Add('Не отличаются');
end;
5:
begin
if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Какой элемент считывается из стека?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('Последний');
RadioGroup1.Items.Add('Любой');
RadioGroup1.Items.Add('Первый');
end;
6:
begin
if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Чем отличается дек от стека?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('Добавление в любом место. Удаление из начала');
RadioGroup1.Items.Add('Добавление в начало. Удаление из любого места');
RadioGroup1.Items.Add('Все включения исключения происходят на обоих его концах');
end;
7:
begin
if RadioGroup1.ItemIndex = 2 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Откуда считывается элемент из очереди?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('С конца');
RadioGroup1.Items.Add('С начала');
RadioGroup1.Items.Add('Из люього места');
end;
8:
begin
if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Куда добавляется элемент в стек?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('В конец');
RadioGroup1.Items.Add('В начало');
RadioGroup1.Items.Add('В любое место');
end;
9:
begin
if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Какую ссылку содержит последний элемент циклического списка?');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('На первый элемент');
RadioGroup1.Items.Add('На предыдущий элемент');
RadioGroup1.Items.Add('NIL');
end;
10:
begin
if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Если все включения и исключения происходят на одном конце списка, то это ...');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('однонаправленный список');
RadioGroup1.Items.Add('двунаправленный список');
RadioGroup1.Items.Add('очередь');
RadioGroup1.Items.Add('стек');
RadioGroup1.Items.Add('дек');
RadioGroup1.Items.Add('циклический список');
end;
11:
begin
if RadioGroup1.ItemIndex = 3 then Inc(NumberTrueAnswer);
Memo1.Lines.Add('Если последний элемент имеет ссылку на первый элемент, то это ...');
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('однонаправленный список');
RadioGroup1.Items.Add('двунаправленный список');
RadioGroup1.Items.Add('очередь');
RadioGroup1.Items.Add('стек');
RadioGroup1.Items.Add('дек');
RadioGroup1.Items.Add('циклический список');
end;
12:
begin
if RadioGroup1.ItemIndex = 5 then Inc(NumberTrueAnswer);
Button1.Hide;
if NumberTrueAnswer >= 10 then ShowMessage('Ваша оценка - ОТЛИЧНО!');
if (NumberTrueAnswer >= 8) and (NumberTrueAnswer < 10) then ShowMessage('Ваша оценка - ХОРОШО!');
if (NumberTrueAnswer >= 6) and (NumberTrueAnswer < 8) then ShowMessage('Ваша оценка - ТРИ!');
if NumberTrueAnswer < 6 then
begin
ShowMessage('Тебе однозначно нужно почитать теорию. Твоя оценка - Два!!!');
ff := False;
end;
Form16.Hide;
Form1.Show;
if not ff then Form18.Show;
end;
end;
end;
procedure TForm16.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form16.Hide;
Form1.Show;
if not ff then Form18.Show;
end;
end.
82