(1 курс ФИИТ) ОП - лекц - 2015 (устарело)

Для каких списков? Там public есть?

Да, с public работает. Но почему раньше работало и без него?

Мне Админ говорил, что с самого начала только паблик и печатало. Может, вы что-то путаете… ну, или он :slight_smile:

Приведите пожалуйста код. Код - лучшее доказательство.

Для односвязных списков конечно. С двусвязными так не поработаешь, мешают ссылки на предыдущий элемент, выводится слишком много всего=)

Опубликуйте код. У нас всё работает

Какой код? Для односвязных списков Ulysses уже объяснил мне, что дело было в public. Для двусвязных списков у меня переполняется стек, если пробовать его вывести обычным Writeln. Я и не думал, что это будет работать. Или это должно работать?

Опубликуйте текст программы, которая не работает.

Не публикуйте скриншоты. Мы их не умеем запускать.

type
  DNode<T> = auto class
  public
    data: T;
    prev, next: Dnode<T>;
  end;
  DList<T> = (DNode<T>, DNode<T>);

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  first.next := last;
  Writeln(first);
end.

О, автокласс, а что ж вы на занятии не рассказали…

Если сделать без автокласса, то будет даже что-то выводиться.

type
  DNode<T> = class
  public
    data: T;
    prev, next: DNode<T>;
    constructor(data: T; prev, next: DNode<T>);
    begin
      self.data := data;
      self.prev := prev;
      self.next := next;
    end;
  end;
  DList<T> = (DNode<T>, DNode<T>);

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  first.next := last;
  Writeln(first);
end.

Как я понимаю, вывод этих элементов зацикливается из-за ссылки на предыдущий. Но почему так не возникает переполнения стека?

Объясните, пожалуйста.

Ага, понятно.

С автоклассами тоже должно выводиться. Если бы Вы не зациклили список, то вывелось бы, а так заработали переполнение стека.

Так всё выводится:

type
  DNode<T> = auto class
    data: T;
    prev, next: Dnode<T>;
  end;

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  Writeln(last);
end.

Вывод без автоклассов не зацикливается. В этом случае он более интеллектуальный - как раз отслеживаются вот такие циклические структуры данных. Вывод прерывается при определенной глубине рекурсии - как раз для таких случаев чтобы исключить переполнение стека. Вместо оставшегося ставится …

Собственно, перед Вами - бесконечный список из чередующихся 1 и 2. Всё верно.

Спасибо, теперь всё понятно.

кстати, что будет со всей информацией по нашему бывшему 1 курсу(ныне 2) (на форуме) ?будет она как-то меняться?

Наша тема по практике уже в архиве. Было бы неплохо перенести и эту тему туда, а для первокурсников создать новую такую же.

1 лайк