Здравствуйте. Проверьте, пожалуйста, правильно ли выполнено задание: Реализуйте заданную структуру данных (двусвязный список целых чисел) в виде класса (набора классов). Не используйте стандартные классы .NET для представления коллекций ( разрешается использование только массивов).
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
type PList = ^TList; TList = record inf : integer; prior: PList; next : PList end;
destructor TListDual.RemoveList; {уничтожение списка} var q: Plist; begin if pfirst = nil then writeln('List not init') else begin while pfirst <> nil do begin q := pfirst; pfirst := pfirst^.next; dispose(q); end; end; plast := nil; end;
procedure TListDual.Print_forward; { процедура печати элементов с первого(начало) } var start : PList; begin if pfirst = nil then writeln('List not init') else begin start := pfirst; while (start <> nil) do begin write(start^.inf, ' '); start := start^.next; end; WriteLn; end; end;
procedure TListDual.Print_back; { процедура печати элементов с последнего(начало) } var last : PList; begin if plast = nil then writeln('List not init') else begin last := plast; while (last <> nil) do begin write(last^.inf, ' '); last := last^.prior; end; WriteLn; end; end;
procedure TListDual.Insert( NewInf : integer); {процедура вставки элементов в конец списка(информационная часть) } var p : PList; begin new(p); p^.inf := NewInf; p^.next := nil; if (pfirst=nil) and (plast=nil) {если пустой список} then begin pfirst := p; pfirst^.prior := nil; end else {список не пуст, добавляем элемент в конец и корректируем указатели} begin plast^.next := p; p^.prior := plast; end; plast := p; end;
begin { TODO -oUser -cConsole Main : Insert code here } end.
constructor TObj.Create(AValue : String); begin Value := AValue; end;
destructor TObj.Destroy; begin Inherited; end;
function TObj.ToString; begin Result := Value; end;
// А это, собственно, и будут 2 обобщенных класса, реализующих список type TPrintProcedure<T> = reference to procedure(const Value: T); TList<T> = class inf : T; prior : TList<T>; next : TList<T>;
function TListDual<T>.IsEmpty : Boolean; begin Result := (pFirst = nil); end;
destructor TListDual<T>.Destroy; var q : Tlist<T>; begin if IsEmpty then writeln('<list is empty>') else begin while not IsEmpty do begin q := pfirst; pfirst := pfirst.next; q.Free; end; end; plast := nil; inherited; end;
procedure TListDual<T>.Print_forward; var start : TList<T>; begin if IsEmpty then writeln('<list is empty>') else begin start := pfirst; while (start <> nil) do begin PrintItem(start.inf); start := start.next; end; WriteLn; end; end;
procedure TListDual<T>.Print_back; var last : TList<T>; begin if IsEmpty then writeln('<list is empty>') else begin last := plast; while (last <> nil) do begin PrintItem(last.inf); last := last.prior; end; WriteLn; end; end;
procedure TListDual<T>.Insert(NewInf : T); var p : TList<T>; begin P := TList<T>.Create(NewInf, PLast, nil); if IsEmpty then pfirst := P else plast.next := p;
plast := P; end;
var L : TListDual<Integer>; LObj : TListDual<TObj>; i : Integer; begin try // Сначала тестируем целочисленный список L := TListDual<Integer>.Create( procedure (const Value : Integer) begin write(Value, ' '); end ); for i := 1 to 10 do begin L.Insert(i); end; L.Print_Back; L.Print_Forward; L.Free;
// Потом - список TObj-ектов LObj := TListDual<TObj>.Create( procedure (const Value : TObj) begin write(Value.ToString, ' '); end ); for i := 1 to 10 do begin LObj.Insert( TObj.Create('String #' + IntToStr(i)) ); end; LObj.Print_Back; LObj.Print_Forward; LObj.Free;
ReadLn; except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end.
Я там немного поменял способ задания процедуры печати, если есть дженерики - значит есть и анонимные процедуры, вот их использование я и показал. Разумеется, проход вперед/назад по списку можно было сделать по-другому, через For .. In, но это еще усложнит код, так что не буду этого делать сейчас. Только, если тебя заинтересует
[offtop mode]
Цитата
Володь, давно подпись сменил? Я только заметил )). Класс!
Спасибо. Нет, недавно, она появилась-то в доме всего месяц назад... Скоро еще добавлю фотографий.
Цитата
Рекомендую аватар вырезать из фото 22
Не, это чересчур будет У меня, правда, бывает такое же выражение лица, когда я читаю некоторые вопросы, но не всегда же [/offtop mode]