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

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

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

Автор: Rocket 8.05.2007 0:39

В программе приведены различные операции с двусвязным списком.
Настораживают два пункта: добавление(добавляет всё время за первым добавленным) и удаление(удаляет всё время элементы по порядку после первого). Явно косяки... Прошу посмотреть. smile.gif


Прикрепленные файлы
Прикрепленный файл  ДвусвязныйСписок.pas ( 4.27 килобайт ) Кол-во скачиваний: 313

Автор: мисс_граффити 8.05.2007 1:19

что за интересная конструкция?

    while (temp^.info<>x) and (temp^.right<>nil) do 
temp:=temp^.right;
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;

begin к чему относится?

Автор: Rocket 8.05.2007 1:31

Цитата(мисс_граффити @ 7.05.2007 22:19) *

что за интересная конструкция?
    while (temp^.info<>x) and (temp^.right<>nil) do 
temp:=temp^.right;
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;

begin к чему относится?


То есть нужно так?

    while (temp^.info<>x) and (temp^.right<>nil) do 
begin
temp:=temp^.right;

extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;

вроде тож не пашет\\\




Автор: мисс_граффити 8.05.2007 2:02

а теперь минутку подумай, что ты так делаешь:
1. пока не нашли нужное значение и не дошли до конца списка...
2. переходим на следующий элемент
3. запоминаем еще следующий и его удаляем

вот и представь, сколько элементов удалится...

в цикле должен быть только переход на следующий элемент.
а вот дальше, если мы нашли, что собираемся удалять (как в односвязных - у тебя ж была логическая переменная), то удаляем...
кстати, не забудь, что перекидывать надо не 1, а 2 указателя.

Автор: Rocket 8.05.2007 23:14

Цитата(мисс_граффити @ 7.05.2007 23:02) *

а теперь минутку подумай, что ты так делаешь:
1. пока не нашли нужное значение и не дошли до конца списка...
2. переходим на следующий элемент
3. запоминаем еще следующий и его удаляем

вот и представь, сколько элементов удалится...

в цикле должен быть только переход на следующий элемент.
а вот дальше, если мы нашли, что собираемся удалять (как в односвязных - у тебя ж была логическая переменная), то удаляем...
кстати, не забудь, что перекидывать надо не 1, а 2 указателя.


Вот работающий вариант:

procedure ToDelete(var walk:list; x:integer);
var
temp,extra:list;
found:boolean;
begin
found:=false;

if walk=nil then
begin
writeln('Cnucok nycT');
readln;
end;

if (walk^.right=nil) and (walk^.left=nil) then
if walk^.info=x then
begin
dispose(walk);
walk:=nil;
end
else halt;

if walk<>nil then
if walk^.info=x then
begin
found:=true;
temp:=walk;
walk:=walk^.right;
dispose(temp)
end
else
begin

temp:=walk;

while not found and (temp^.right<>nil) do
if temp^.right^.info=x then found:=true
else temp:=temp^.right;
if found then
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;
end;


Ещё раз спасибо!
Зы Но всё-таки, почему новый элемент всё время добавляется после первого?

Автор: мисс_граффити 9.05.2007 5:56

посмотрела внимательнее.
во-первых, у тебя не совсем правильно работает очистка списка. надо

procedure ToListClear(var first:list);
(в односвязном. и в двусвязном - тоже var)

во-вторых (по поводу добавления)
а куда ты хочешь добавлять?
вот так будет добавляться перед первым:
procedure ToAdd(var walk:list;x:integer);
var temp:list;
begin
new(temp);
temp^.info:=x;
if walk=nil then
begin
walk:=temp;
walk^.right:=nil;
walk^.left:=nil;
end
else
begin
temp^.right:=walk;
walk^.left:=temp;
temp^.left:=nil;
walk:=temp;
end;
end;

Автор: 7rubin 9.04.2012 1:23

Реализация двусвязног списка
buytask.ru/task767.html