IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Двусвязный список в виде класса
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Женский

Репутация: -  0  +


Здравствуйте.
Проверьте, пожалуйста, правильно ли выполнено задание:
Реализуйте заданную структуру данных (двусвязный список целых чисел) в виде класса (набора классов).
Не используйте стандартные классы .NET для представления коллекций ( разрешается использование только массивов).


program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
PList = ^TList;
TList = record
inf : integer;
prior: PList;
next : PList
end;

TListDual = object
private
pfirst, plast : PList;
public
constructor Init;
destructor RemoveList;
procedure Print_forward;
procedure Print_back;
procedure Insert( NewInf : integer);
end;

constructor TListDual.Init; {инициализация списка }
begin
pfirst := nil; plast := nil;
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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Ничего особенного делать не надо, разницы, что именно хранить, целые числа или ссылки на объект класса, никакой нет. Только не надейся, что все будет вот так вот безоблачно smile.gif Во-первых, проблема будет с выводом данных (печать через WriteLn допустима для встроенных типов, но не для объектов, WriteLn просто не умеет печатать объекты). Но это еще не все. Проблема вторая: при уничтожении списка нужно удалять и его содержимое. В случае, который рассмотрен выше (список целых) этого делать не надо, а вот если список будетхранить ссылки на какие-то объекты, то объекты эти надо будет уничтожать, иначе будут утечки. И тут возникает вопрос: а как, собственно, отличить, работает список с Integer-ами (или Boolean-ами, или Double-ами), которые удалять не надо, или с объектами самописных типов, которые удалять-таки нужно? Вот тут, я имею в виду:

type
T = TSomeClass; // Какой-то тип, потомок TObject, как все классы

// Класс, хранящий элемент списка, практически не изменяется,
// разве что добавляется деструктор. В котором и будет проблема
TList = class
inf : T;
prior: TList;
next : TList;

constructor Create(AInf : T; APrev, ANext : TList);
destructor Destroy; override;
end;


constructor TList.Create(AInf : T; APrev, ANext : TList);
begin
Inf := AInf;
Prior := APrev; Next := ANext;
end;
destructor TList.Destroy;
begin
inf.Free; // Попытка сделать это, когда Inf - переменная простого типа - ошибка
end;


// Создаваться элемент списка может так:
L := TListDual.Create;
for i := 1 to 10 do
begin
L.Insert( TSomeClass.Create('Object #' + IntToStr(i)) );
end;



, не сделать вышеописанное в деструкторе - утечка, когда работаем с классами. Что делать думаешь? Какие есть мысли по преодолению проблемы? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Rei-li   Двусвязный список в виде класса   21.09.2011 0:27
IUnknown   Здесь: все делается проще: procedure TListDual.Ins…   21.09.2011 2:29
Rei-li   Спасибо. В том то и дело, что оно работает, но мен…   21.09.2011 2:42
IUnknown   Значит, сделай так: program Project2; {$APPTY…   21.09.2011 3:04
Гость   Огромное спасибо !!! Буду разбираться.…   21.09.2011 3:34
IUnknown   Ничего особенного делать не надо, разницы, что име…   21.09.2011 6:31
Rei-li   Я так понимаю, что в проблеме с деструктором дело …   21.09.2011 7:25
TarasBer   > Какие есть мысли по преодолению проблемы? По…   21.09.2011 13:14
IUnknown   На самом деле, возможных решений проблемы - 2 (кро…   21.09.2011 14:43
Lapp   Володь, давно подпись сменил? Я только заметил ))…   21.09.2011 15:21
Rei-li   Скажите, пожалуйста, надо писать именно T = TSomeC…   21.09.2011 20:38
IUnknown   Это дженерики. Тебе что, надо реализацию именно на…   21.09.2011 21:42
Rei-li   Спасибо, мне именно на дженериках и надо было. Но …   22.09.2011 3:44
IUnknown   Вот тут можно почитать об анонимных методах: http:…   22.09.2011 4:03
Rei-li   Спасибо большое, классно написано. Многое стало бо…   22.09.2011 5:51
TarasBer   Почитал ссылку > На практике очень часто приме…   22.09.2011 13:31
IUnknown   Анонимные методы реализуются с помощью интерфейса,…   22.09.2011 13:53


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 14.05.2024 13:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name