Здравствуйте, уважаемые участники форума!
Прошу помощи в решении этой задачи:
Даны указатели 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 про списки... попробуй сам начать - хотя бы создать список.
а, то есть список не просто двусвязный, а еще и циклический... хотя это мало на что влияет.
как продвигается чтение FAQ?
Списки есть... Как односвязные, так и двухсвязные... Как в процедурном, так и в объектном виде... В поиске можно также найти несколько задач на циклические списки... А вот теперь - внимание, вопрос: что является тем самым непреодолимым для тебя препятствием, что ты не можешь даже начать решать задачу, прочитав (если прочел, а не бегло просмотрел, конечно) то, что есть на форуме?
и здесь философия.... как она замучала!!!
сорри за офф.
sonic, я могу написать программу, но ведь от этого твой страх не исчезнет. значит, будем с ним бороться другими способами.
начнем с того, что ты напишешь программку, создающую список.
в FAQ это все есть.
Сделал заполнение списка, вроде всё правильно, прошу посмотреть опытных людей:
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.
p^.Prev:=pred;
решил задачу, вот как получилось:
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.