IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Двусвязный список из односвязного
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской
Реальное имя: Руслан

Репутация: -  0  +


Всем привет, нужна помощь.
Дан массив указателей на списки (а именно на первые коэф-нты). Вот программа, она работает :
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.
Помогите, люди, плз. Я уже в конец запутался в этой задаче, буду очень признателен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2020 12:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name