Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запись двухсвязного списка в файл


Автор: Jade 13.12.2006, 10:09
В общем есть двухсвязный списочек - имитация базы данных о животных, например.

Код

type
  ptr=^Tanimal;         //указатель на запись
  TAnimal = record
    Name: string[20];  //имя
    Fam: string[20];   //семейство
    Height: integer;    //рост
    Weight: integer;    //вес
    previous:ptr;            //указатель на предыдущее поле
    next:ptr;                //указатель на следующее поле
  end;


Использую такие переменные - 

Код

var
  Form1: TForm1;
  Anim : TAnimal;
  first,cur,last:ptr;


Т.е. указатели на первый, последний и текущий элементы.

На форме красиво добавляются, удаляются и прокручиваются по одному все элементы.
Проблема - записать этот список в какой-то бинарный файл и потом считать его оттуда.
Делаю File of TAnimal - тогда как обратиться к связям?
Или File of ptr, тогда будут сами указатели.

Буду очень благодарен за помощь.

Автор: Romkin 13.12.2006, 10:39
Указатели в файл не пишутся. Более того, записать в файл именно двухсвязный список - задача нетривиальная, если сохранять возможность дозаписи. 
Пиши просто последовательно записи без полей указателей, при считывании - создавай новый узел, заполняй полями из файла, устанавливай указатели. Не надо делать в файле связи.
PS. И вообще, зачем тебе двухсвязный список? Поизвращаться хочется? Он очень редко нужен, и явно у тебя - не тот случай. Есть TList, TObjectList, TCollection - неужели не подходят?

Автор: Alexeis 13.12.2006, 11:08
Цитата(Romkin @  13.12.2006,  10:39 Найти цитируемый пост)
Не надо делать в файле связи.

Можно просто их пронумеровать, а вместо указателей писать номер элемента на который он должен ссылаться т.е. номер предыдущего или предшественика.

Автор: Romkin 13.12.2006, 11:17
Цитата(alexeis1 @  13.12.2006,  11:08 Найти цитируемый пост)
Можно просто их пронумеровать, а вместо указателей писать номер элемента на который он должен ссылаться т.е. номер предыдущего или предшественика.

Можно. И делают. Только, во-первых, этот номер - обычно смещение нужной записи от начала файла, иначе что, каждый раз считать? А во-вторых, список-то двухсвязный, считать дважды. Стараясь не запутаться в ссылках smile 

Автор: Jade 19.12.2006, 04:52
хм...
объясните пожалуйста мне тупому как именно считать.
добавлять в записи еще и поле для нумерации? smile 
а как считывать потом? 

Автор: Romkin 19.12.2006, 09:14
ЗАчем поле для нумерации? Ты как список создаешь, ведь наверняка создаешь узел, заполняешь его, а потом добавляешь в начало/конеч списка. 
Что мешает взять файл записей с данными, пройти его последовательно, и для каждой записи создать узел, заполнить его данными из этой записи, и вставить в список? 
Получается - последовательно проходим файл, и одновременно последовательно наращиваем список.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)