Помощь - Поиск - Пользователи - Календарь
Полная версия: Необходима помощь в решении задачи с динамическими структурами
Форум «Всё о Паскале» > 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.


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