Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Двусвязный список из односвязного

Автор: Rusl 4.06.2007 16:21

Всем привет, нужна помощь.
Дан массив указателей на списки (а именно на первые коэф-нты). Вот программа, она работает :

program lab;
uses crt;
const n=5;
k=3;

type listPtr=^list; {1-svaz. spisok}

List=object
Barier:boolean;
nomer:word; {Nomer koeff-ta}
koeff:integer; {koefficient}
next:listPtr;

constructor init(nom,g:word);
procedure print(first:boolean);
end;

Var A:array [1..n] of listPtr; {massiv uravneniy}
Aravno:array[1..n] of integer; {Massiv ravno}
i,nomer:word;

constructor list.init (nom,g:word); {nom-nomer koeff-ta; g- kol-vo nenulevih koeff-tov}
Var exists:integer;
begin
if (nom<=n) and (g<=k) then begin
exists:=random(2); {est' ili net}
if exists<>0 then begin
barier:=false; barier:=false;
nomer:=nom;
koeff:=random(50)+1;
new(Next);
next^.init(nom+1,g+1);
end
else init(nom+1,g);
end
else begin barier:=true; Aravno[i]:=random(51); end;
end;

procedure list.print (first:boolean);
begin
if not barier then begin
if first then write(koeff,'x',nomer)
else write(' + ',koeff,'x',nomer);
first:=false;
next^.print(first);
end
else writeln(' = ',Aravno[i]);
end;

begin
clrscr;
randomize;
for i:=1 to n do begin
new(a[i]);
a[i]^.Init(1,1);
end;
for i:=1 to n do begin
write(i,') ');
a[i]^.print(true);
end;
readln;
end.


теперь необходимо написать 2 разных метода, первый из которых должен оставлять исходный объект без изменений, а второй - применять информационные элементы исходного объекта при формировании двусвязного списка. Каждый из этих двух методов должен иметь в качестве параметра указатель на формируемый двусвязный список. Второй метод (освобождающий память) должен быть деструктором.
Прочитал FAQ, пробовал наследованием. Получается так :
program lab;
uses crt;
const n=5;
k=3;

type listPtr=^list; {1-svaz. spisok}

list=object
barier:boolean;
nomer:word; {Nomer koeff-ta}
koeff:integer; {koefficient}
next:listPtr;

constructor init(nom,g:word);
procedure print(first:boolean);
end;
type list2Ptr=^list2; {2-svaz. spisok}

list2=object(list)
next2:list2Ptr;
prev:list2Ptr; {pred. zveno}

constructor init2;
procedure print2(first2:boolean);
end;

Var A:array[1..n] of listPtr; {massiv uravneniy}
Aravno,Bravno:array[1..n] of integer; {Massiv ravno}
B:array[1..n] of list2Ptr;
i,nomer:word;

constructor list.init (nom,g:word); {nom-nomer koeff-ta; g- kol-vo nenulevih koeff-tov}
Var exists:integer;
begin
if (nom<=n) and (g<=k) then begin
exists:=random(2); {est' ili net}
if exists<>0 then begin
barier:=false; barier:=false;
nomer:=nom;
koeff:=random(50)+1;
new(Next);
next^.init(nom+1,g+1);
end
else init(nom+1,g);
end
else begin barier:=true; Aravno[i]:=random(51); end;
end;

procedure list.print (first:boolean);
begin
if not barier then begin
if first then write(koeff,'x',nomer)
else write(' + ',koeff,'x',nomer);
first:=false;
next^.print(first);
end
else writeln(' = ',Aravno[i]);
end;

constructor list2.Init2;
begin
init(1,1);
new(next2);
next2^.barier:=next^.barier;
next2^.nomer:=next^.nomer;
next2^.koeff:=next^.koeff;
next2^.prev:=prev^.next2;
end;
procedure list2.print2(first2:boolean);
begin
if not barier then begin
if first2 then write(koeff,'x',nomer)
else write(' + ',koeff,'x',nomer);
first2:=false;
next2^.print(first2);
end
else writeln(' = ',bravno[i]);
end;

begin
clrscr;
randomize;
for i:=1 to n do begin
new(b[i]);
b[i]^.Init2;
bravno[i]:=aravno[i];
end;
for i:=1 to n do begin
write(i,') ');
b[i]^.print2(true);
end;
readln;
end.

правда еще не используется prev, но проблема в другом
Сначала второй инит был таким:
constructor list2.Init2;
begin
init(1,1);
new(next2);
next2^.barier:=next^.barier;
next2^.nomer:=next^.nomer;
next2^.koeff:=next^.koeff;
next2^.prev:=prev^.next2;
end;

При этом из первого коэф-нта просто навсего по Next создавался односвязный список, а параллельно в next2 оставался nil, теперь, как я понял, еще копируется последний коэф-нт
Судя по всему осталась задача раскрыть init и сразу пересохранять информацию из next в next2, а заодно указать prev.
Помогите, люди, плз. Я уже в конец запутался в этой задаче, буду очень признателен