Задача таже, что и в этой теме. Но там на линейные списки. Нужно ее переделать для двунапраленных. Сделал вот что на основе того кода:
program lab11; uses crt; type pnode=^node; node=record data:integer; pred,next:pnode; end; procedure add(p:pnode;k:integer); var pp,new_p:pnode; begin pp:=p; while pp^.next <> nil do begin pp := pp^.next; end; new(new_p); new_p^.next:=nil; new_p^.pred:=pp; new_p^.data:=k; pp^.next:=new_p; if pp = nil then p := new_p else pp^.next := new_p; end; procedure out(t:pnode); var q:pnode; begin q:=t; while q^.next<>nil do begin write(q^.data:4); q:=q^.next; end; end; procedure init(p:pnode); var i:integer; begin p:=nil; for i:=1 to 15 do add(p,integer(random(30)-9)); end; var p,pp,first,second:pnode; begin clrscr; init(p); write('Glavnuy Spisok:'); out(p); first:=nil; second:=nil; pp:=p; while pp <> nil do begin if pp^.data >= 0 then Add(first, pp^.data) else Add(second, pp^.data); pp := pp^.next; end; writeln; write('Spisok pologitelnich elementov:'); out(first); writeln; write('Spisok otrizatelnuch elementov:'); out(second); readkey; end.
Я так понял, что процедура add некоректно работает.
volvo
5.12.2007 20:54
Цитата
Я так понял, что процедура add некоректно работает.
Не только... Начнем именно с Add:
{ Ну, во-первых параметр P надо вернуть, поэтому Var }
procedure add(var p:pnode;k:integer); var pp, new_p:pnode; begin pp:=p; if pp <> nil then { <--- Пробегать по списку надо только если он существует } while pp^.next <> nil do pp := pp^.next;
{ ТЕперь правильный кусок - берем память и заполняем ее } new(new_p); new_p^.next:=nil; new_p^.pred:=pp; new_p^.data:=k;
{ Ту строку, которая у тебя была здесь, я удалил, она была причиной разыменования нулевого указателя. Достаточно и того, что осталось } if pp = nil then p := new_p else pp^.next := new_p; end;
То же самое - в Init: параметр P должен передаваться "по ссылке" - с квалификатором Var.
Ну, а Out у тебя просто "недоговаривает": хвостовой элемент не печатается. Поправь условие:
... q:=t; while q<>nil do { <--- Здесь не надо next } ...
Дальше - не проверял, но поскольку предыдущее задание отработало, то не вижу причин, чтоб не работало это...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.