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

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

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

 
 Ответить  Открыть новую тему 
> Двунапраленные списки
сообщение
Сообщение #1


Новичок
*

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

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


Задача таже, что и в этой теме. Но там на линейные списки. Нужно ее переделать для двунапраленных. Сделал вот что на основе того кода:
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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Я так понял, что процедура 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 }
...
Дальше - не проверял, но поскольку предыдущее задание отработало, то не вижу причин, чтоб не работало это...
 К началу страницы 
+ Ответить 

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

 





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