Помощь - Поиск - Пользователи - Календарь
Полная версия: Необходима помощь в решении задачи с динамическими структурами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sonic
Здравствуйте, уважаемые участники форума!
Прошу помощи в решении этой задачи:
Даны указатели P1 и P2 на барьерный и текущий элементы двусвязного списка. Также даны пять чисел. Используя тип TListB (TListB - запись с полями Barrier и Current типа PNode), описать процедуру LBInsertAfter(L, D), которая вставялет новый элемент со значением D после текущего элемента списка L (L - входной и выходной параметр типа TListB, D - входной параметр целого типа). Вставленный элемент становится текущим. С помощью этой процедуры вставить пять данных чисел в исходный список, и вывести новый адрес его текущего элемента.

Как я позже выяснил у препода, "адрес его текущего элемента" представляет собой номер элемента в списке.
Пользовательские типы PNode и TNode необходимо описывать так:
type 
 PNode = ^TNode
 TNode = record 
  Data: integer;
  Next, Prev: PNode;
 end;

мисс_граффити
что такое барьерный элемент? первый/последний, что ли?
почитай FAQ про списки... попробуй сам начать - хотя бы создать список.
sonic
Цитата(мисс_граффити @ 14.12.2006 13:13) *

что такое барьерный элемент? первый/последний, что ли?
почитай FAQ про списки... попробуй сам начать - хотя бы создать список.


Барьерный элемент - это элемент который связан своими полями Next и Prev с первым и последним элементом исходного списка (поле Data = 0)
мисс_граффити
а, то есть список не просто двусвязный, а еще и циклический... хотя это мало на что влияет.
как продвигается чтение FAQ?
sonic
Цитата(мисс_граффити @ 14.12.2006 14:37) *

а, то есть список не просто двусвязный, а еще и циклический... хотя это мало на что влияет.
как продвигается чтение FAQ?

Почитал FAQ ещё перед тем как создавать тему, ничего подобного не нашел
volvo
Списки есть... Как односвязные, так и двухсвязные... Как в процедурном, так и в объектном виде... В поиске можно также найти несколько задач на циклические списки... А вот теперь - внимание, вопрос: что является тем самым непреодолимым для тебя препятствием, что ты не можешь даже начать решать задачу, прочитав (если прочел, а не бегло просмотрел, конечно) то, что есть на форуме?
sonic
Цитата(volvo @ 14.12.2006 15:16) *

вопрос: что является тем самым непреодолимым для тебя препятствием, что ты не можешь даже начать решать задачу, прочитав (если прочел, а не бегло просмотрел, конечно) то, что есть на форуме?

Непреодолимый страх перед тем, что снова ничего не получится и страх перед безысходностью
мисс_граффити
и здесь философия.... как она замучала!!!
сорри за офф.

sonic, я могу написать программу, но ведь от этого твой страх не исчезнет. значит, будем с ним бороться другими способами.
начнем с того, что ты напишешь программку, создающую список.
в FAQ это все есть.
sonic
Сделал заполнение списка, вроде всё правильно, прошу посмотреть опытных людей:
uses crt;

type
 PNode = ^TNode;
 TNode = record
  Data: integer;
  Next, Prev: PNode;
 end;

 var
  i:integer;
  p,pred,barrier: PNode;

begin

 clrscr;
 randomize;

 for i:=1 to 10 do
  begin
   new(p);
   if (i = 1) then begin p^.Data:=0; barrier:=p;  end
    else
    begin
     p^.Data:= random(9);
     write(i,'- ',p^.Data,' ');
    end;
   p^.Prev:=pred;
   if (i = 10) then
   pred^.Next:=p;
   pred:=p;
  end;

end.
volvo
p^.Prev:=pred;

blink.gif на первой итерации Pred еще не определена... Или ты полагаешься на то, что она будет равна NIL? Тогда у барьерного элемента не будет ссылки на предыдущий, хотя должна быть...
sonic
решил задачу, вот как получилось:

uses crt;

const count=10;

type
 PNode = ^TNode;
 TNode = record
  Data: integer;
  Next, Prev: PNode;
 end;

 TListB = record
  Barrier, Current: PNode;
 end;
 PListB = ^TListB;

procedure LBInsertAfter(var L: PListB; D: integer);
var p: PNode;
begin
 new(p);
 p^.prev:= L^.Current;
 p^.Data:=D;
 p^.Next:= L^.Current^.Next;
 L^.Current^.Next^.prev:=p;
 L^.Current^.Next:=p;
 L^.Current:=p;
end;

 var
  i,curnum,num: integer;
  p,pred,barrier: PNode;
  ListB: PListB;

begin

 clrscr;

 randomize;
 while (curnum <= 1) do
 begin
  curnum:= random(count);
 end;

 new(ListB);

 for i:=1 to count do
  begin
   new(p);
   if (i = 1) then begin p^.Data:=0; ListB^.Barrier:=p; end else p^.Data:= random(9);
   if (i = 10) then ListB^.Barrier^.prev:=p else p^.Prev:=pred;
   if (i = curnum) then ListB^.Current:=p;
   pred^.Next:=p;
   pred:=p;
   write(p^.Data,' ');
  end;
  writeln;
  writeln('Номер установленного текущего элемента: ',curnum);
  writeln;

  i:=1;
  while (i <= 5) do
   begin
    num:= random(20);
    if(num > 10) then
     begin
      LBInsertAfter(ListB, num);
      inc(i);
     end;
   end;

  p:=ListB^.Barrier;
  for i:=1 to count+5 do
   begin
    write(p^.Data,' ');
    p:=p^.Next;
   end;
   writeln;

   writeln('Новый адрес текущего элемента: ',curnum+5);

end.


Что скажете ?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.