Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2011, 21:42   #1
Rei-li
 
Регистрация: 20.09.2011
Сообщений: 4
По умолчанию Двусвязный список в виде класса. delphi

Здравствуйте.
Проверьте, пожалуйста, правильно ли выполнено задание:
Реализуйте заданную структуру данных (двусвязный список целых чисел) в виде класса (набора классов).
Не используйте стандартные классы .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.
Rei-li вне форума Ответить с цитированием
Старый 20.09.2011, 22:36   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
правильно ли выполнено задание
Неправильно.
В задании сказано "Двусвязный список в виде класса". В коде же нет ни намека на классы - ни на стандартные, ни на кустарные-самописные.
mss вне форума Ответить с цитированием
Старый 20.09.2011, 23:52   #3
Rei-li
 
Регистрация: 20.09.2011
Сообщений: 4
По умолчанию

Подскажите, пожалуйста, а как тогда нужно сделать?
Rei-li вне форума Ответить с цитированием
Старый 21.09.2011, 01:34   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В коде же нет ни намека на классы
ну, насколько я понимаю, достаточно вместо object написать class, чтобы появился "кустарно-самописный" класс:
Код:
  TListDual = class
  private
    pfirst, plast : PList;
  public
    constructor Init;
    destructor RemoveList;
    procedure Print_forward;
    procedure Print_back;
    procedure Insert( NewInf : integer);
  end;
создавать и использовать экземпляр класса можно, например, так:
Код:
var LDual : TListDual;
begin
  LDual := TListDual.Init;
  LDual.Insert(10);
  LDual.Insert(20);
  LDual.Insert(30);
  LDual.Print_forward;
  LDual.Print_back;
  LDual.RemoveList;
  readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2011, 01:58   #5
Rei-li
 
Регистрация: 20.09.2011
Сообщений: 4
По умолчанию

Огромное спасибо !!!
Подскажите, пожалуйста, а как теперь написать обобщенную реализацию для этого двусвязного списка, позволяющую хранить объекты (ссылочные переменные)?
Rei-li вне форума Ответить с цитированием
Старый 21.09.2011, 02:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, если я правильно Вас понял, то в record добавьте ссылку на объект нужного типа (который планируется хранить, если тип объекта заранее неизвестен, тогда используйте тип pointer). не забудьте переписать процедуры работы со списком (в основном это коснётся процедур добавления и очистки списка).
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список Даsha Помощь студентам 3 26.06.2011 11:45
Двусвязный список narcot Visual C++ 13 28.05.2011 21:12
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58
Шаблон класса "Двусвязный список DIMON007 Помощь студентам 0 17.05.2010 17:35
delphi (двусвязный неупорядоченный список) KaZaaM Помощь студентам 10 27.05.2009 22:15