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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2008, 18:28   #1
AlenaZ
Новичок
Джуниор
 
Регистрация: 09.06.2008
Сообщений: 1
Вопрос сохранение структуры (динамические списки очередей) в файле

Пишу курсовую, задание:
Программная реализация упорядоченного динамического списка динамических очередей.
• Типовой набор операций:
о добавление нового элемента, в том числе - из вспомогательной структуры
o удаление заданного элемента с возможностью сохранения во вспомогательной структуре
o поиск заданного элемента
o просмотр вспомогательной структуры удаленных элементов
o сохранение структуры во внешнем файле
o загрузка структуры из внешнего файла

Всё вроде реализовала, кроме сохранения структуры в файле. Можно просто скопировать данные из списка очередей в массив и записать его в файл, но, думаю, это будет ошибкой. Есть какие-нибудь варианты, как Всю структуру (с динамическим списком и очередями) сохранить в фаил?) Помогите, пожалуйста.

Вот кусочек модуля основной структуры (вспомогательную, думаю, выкладывать не нужно):

Код:
unit listOFqueue2;

interface

  type
  pQueue = ^TQueue;       //ссылочный тип для адресации элементов очереди
  TQueue = record            //базовый тип: структура элемента очереди
  info : integer;                 //информационная часть
    nextq : pQueue;           //ссылочная часть: адрес след.элемента
  end;

  pList = ^tList;
  tList = record
  next : pList;
  inf: integer;
  FirstSub : pQueue;
   end;
  var
  pFirst,pLast : pQueue;
  X: integer;
  pHead: pList; //указатель на заголовок
  ans: char;

  procedure createlist;
  procedure listview;
  procedure add3;
  procedure delete;
  procedure create_q;
  procedure Add_q;
  procedure currqueue;
    procedure search_q;
  procedure search;

implementation
 Uses subList1;
procedure createlist;
  begin
   New(phead);
    pHead^.next:=nil;
 
  end;

  procedure listview;
  var pCurrentM:pList;

  begin 
  writeln('Текущий список имеет вид');
    pCurrentM:=pHead^.next; 

    while pCurrentM <>nil 
    do        begin
    pFirst:=pCurrentM^.FirstSub; currqueue; writeln;
    pCurrentM:=pCurrentM^.next;
    end;
    writeln;
  end;

procedure add3;
label lb3;
var pPrev, pCurrent,pTemp: pList;
pX : Pqueue;
begin
if pHead^.next=nil then 
      begin
        create_q;
        ans:='y';
        while ans='y' do begin
                               Add_q;
                               write('Добавить еще элемент в очередь? y/n: ');
                               readln(ans); end;
        New(pTemp);
        pTemp^.FirstSub:=pFirst;
        pX:=pFirst^.nextq;
        pTemp^.inf:=pX.info;
     
        pHead^.next:=pTemp;
        goto lb3;
      end;

writeln('Новая очередь в списке');
create_q;
        ans:='y';
        while ans='y' do begin
                               Add_q;
                               write('Добавить еще элемент в очередь? y/n: ');
                               readln(ans); end;
New(pTemp);
pTemp^.FirstSub:=pFirst;
pX:=pFirst^.nextq;
X:=pX^.info;
pTemp^.inf:=pX.info;

pCurrent:=pHead^.next;
pPrev:=pHead;
while (pCurrent <>nil) and (pCurrent^.inf < X) do
   begin pPrev:=pCurrent; pCurrent:=pCurrent.next; end;//конец цикла
            if pPrev=pHead then
                    begin
                   writeln('В самое начало списка будет введен элемент ', x);
                   writeln;
                      pTemp^.next:=pCurrent;
                      pHead^.next:=pTemp;
                   end
             else
            begin
            writeln('После элемента ', pPrev^.inf, ' будет введен элемент ', x);
              writeln;
               pTemp^.next:=pCurrent;
               pPrev^.next:=pTemp;
            end;
lb3:
end;

  procedure create_q;
  begin
    New(pFirst);
       pFirst^.nextq:=nil;
       pLast:=pFirst;
  end;

  procedure Add_q;
  var
  qTemp:pQueue;

  begin //начало процедуры добавление в очередь
   new(qTemp);
   x:=random(100);
  qTemp^.info:=X;
  writeln('X = ',qTemp^.info);
  qTemp^.nextq:=nil;
  If pFirst^.nextq=nil then
    begin pFirst^.nextq:=qTemp;
    writeln('Элемент по которому будут находить очередь', qTemp.info);
    end;
  pLast^.nextq:=qTemp;
  pLast:=qTemp;
  writeln;

  end;// конец процедуры 

  procedure currqueue;
  var qTemp:pQueue;
  begin //начало процедуры отображения
    if pFirst^.nextq=nil then writeln('Очередь пуста')
   else
   begin
    qTemp:=pFirst^.nextq;
     while qTemp<>nil do
     begin
     write(qTemp^.info,' ');
     qTemp:=qTemp^.nextq;
     end;
  end;
  end;  //конец процедуры отображения

end.
AlenaZ вне форума Ответить с цитированием
Старый 09.06.2008, 20:13   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от AlenaZ Посмотреть сообщение
Всё вроде реализовала, кроме сохранения структуры в файле. Можно просто скопировать данные из списка очередей в массив и записать его в файл, но, думаю, это будет ошибкой.
Почему это ошибкой? Это чуть ли не единственный вариант. Нужно просто добавить к очередям/спискам по одной целочисленной переменной для хранения индекса в массиве этой переменной и по одной для ссылок (или определить вспомогательны тип для этой цели) и перегнать всю структуру в массив, расставляя индексы ссответственно. Ну а массив потом записать, уже без "настоящих" ссылок - для экономии места и в связи с их бесполезностью в файле. Потом изначальную структуру можно будет легко восстановить.
B_N вне форума Ответить с цитированием
Старый 09.06.2008, 20:14   #3
Sunrise
Пользователь
 
Регистрация: 09.06.2008
Сообщений: 20
По умолчанию

Цитата:
Можно просто скопировать данные из списка очередей в массив и записать его в файл, но, думаю, это будет ошибкой.
Почему? Вполне можно записать в таком формате:
Код:
n //количество очередей в списке
n1 //кол-во элементов в первом списке
  первый элемент первого списка
  второй элемент первого списка
  ...
n2 //кол-во элементов во втором списке
  ...
...
nn //кол-во элементов в n-ном списке
  ...
Отступы для удобства чтения, на самом деле их быть не должно.
Также, если этот способ по каким-то причинам не подходит, можно попробовать сохранять в XML.
Sunrise вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ shvarz Общие вопросы C/C++ 1 10.05.2008 19:48
Динамические структуры данных в Паскале ЯншинаВера Помощь студентам 2 30.03.2008 13:10