Рефераты

Линейные списки. Стек. Дек. Очередь

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;

begin

GetQueue(QueueBegin);

if QueueBegin <> nil then

begin

i := QueuePos;

while (Edit3.Text[i] <> ' ') and (i ' ') and (i 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; //

[pic]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.

-----------------------

4

2

1

3

5

Включить

Исключить

Конец

Третий

Второй

1

3

5

4

2

2

1

3

5

N

4

Включить или исключить

Новый

4

3

2

1

Третий сверху

Новый

Конец

Третий

Второй

Начало

Низ

Верх

Включить или исключить

Второй сверху

Рис. 1 Стек, представленный в виде железнодорожного разъезда

Включить или исключить

Правый конец

Второй справа

Второй слева

Левый конец

N

N

4

3

2

1

Р

*

Р

Указываемый объект

*

Содержимое

Адрес

Связанное распределение

Содержимое

Адрес

Последовательное распределение

B:

C:

D:

E:

Л:

B

C

D

E

Л

Элемент 1

Элемент 2

Элемент 3

Элемент 4

Элемент 5

L0 + c:

L0 + 2c:

L0 + 3c:

L0 + 4c:

L0 + 5c:

Элемент 1

Элемент 2

Элемент 3

Элемент 4

Элемент 5

FIRST

Элемент 5

Элемент 4

Элемент 3

Элемент 2

Элемент 1

Элемент [pic]

FIRST

Элемент 5

Элемент 4

Элемент 3

Элемент 2

Элемент 1

LINK

INFO

PTR

Голова списка

а

а

а

а

nil

3

1

2

4

5

Начало

???????????????????????????????????????????????????????????????????????

????????????????????????????????????????????????????????????????????????????

?????????????????????

Страницы: 1, 2, 3


© 2010 Современные рефераты