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

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

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

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





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

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


Двунаправленный список. Программа должна удалить следующий элемент после нуля.
Пример 8 9 10 0 20 7.
Ответ 8 9 10 20 7.
Преподаватель сказал, что проблема в процедуре, якобы не для двунаправленного списка.
program spiski;

type

List = ^TList;
TList = record
data: integer;
next,
prev: List;
end;

var
nach,teck, ends: List;
i, a: integer;

Procedure Del(var first:List);
Var z,x,dx:List;
Begin
z:=first;
While z<>Nil do
if z^.data=0 then
if z=first then begin
first:=first^.next;
Dispose(x);

end
else begin
if z <> nil then
begin
z:=z^.next;
dx^.next^.next:=z^.next;
Dispose(x);
end
else begin {удалить последний}
writeln ('удалить последний');
end;
end;
dx:=z; z:=z^.next;
End;


procedure Print(spis1: List);
begin
if spis1 = nil then
begin
writeln('Список пуст.');
exit;
end
else begin
while spis1 <>nil do
begin
Write(spis1^.data, ' ');
spis1 := spis1^.next
end;
end;
end;


begin
for i := 1 to 11 do
begin
a := random(8) - 5;
if nach = nil then
begin
new(nach);
nach^.next := nil;
nach^.prev := nil;
ends := nach;
end
else
begin
new(ends^.next);
ends^.next^.prev := ends;
ends := ends^.next;
ends^.next := nil;
end;
ends^.data := a;
end;
teck:=nil;
teck:=nach;
Print(nach);
writeln;
Del(teck);
Print(nach);
writeln;
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

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


В двунаправленном списке нужно корректировать prev, я не вижу, чтобы prev менялся. Когда элемент последний, нужно корректировать указатель на конец списка, то есть, ends, а он даже не передаётся в процедуру. Для самоконтроля можно написать версию Print, которая будет выводить список в обратном порядке.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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