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

> ВНИМАНИЕ!

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

> Двусвязный список в виде класса
Rei-li
сообщение 20.09.2011 20:27
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 20.09.2011 23:04
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Значит, сделай так:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;

type
TList = class
inf : integer;
prior: TList;
next : TList;

constructor Create(AInf : Integer;
APrev, ANext : TList);
end;

TListDual = class
private
pfirst, plast : TList;
public
constructor Create;
destructor Destroy; override;

procedure Print_forward;
procedure Print_back;
procedure Insert(NewInf : integer);

function IsEmpty : Boolean;
end;

constructor TList.Create(AInf : Integer;
APrev, ANext : TList);
begin
Inf := AInf;
Prior := APrev; Next := ANext;
end;

constructor TListDual.Create;
begin
pfirst := nil; plast := nil;
end;

function TListDual.IsEmpty : Boolean;
begin
Result := (pFirst = nil);
end;

destructor TListDual.Destroy;
var q : Tlist;
begin
if IsEmpty then writeln('List not init')
else
begin
while not IsEmpty do
begin
q := pfirst;
pfirst := pfirst.next;
q.Free;
end;
end;
plast := nil;
inherited;
end;

procedure TListDual.Print_forward;
var start : TList;
begin
if IsEmpty 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 : TList;
begin
if IsEmpty 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 : TList;
begin
P := TList.Create(NewInf, PLast, nil);
if IsEmpty then
pfirst := P
else
plast.next := p;

plast := P;
end;

var
L : TListDual;
i : Integer;
begin
L := TListDual.Create;
for i := 1 to 10 do
begin
L.Insert(i);
end;
L.Print_Back;
L.Print_Forward;
L.Free;
end.

- будет тебе в виде набора классов. Проверял в FPC, вроде работает, утечек не дает... Что непонятно в реализации - спрашивай.

Сообщение отредактировано: IUnknown - 20.09.2011 23:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 6.08.2025 22:36
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"