Помощь - Поиск - Пользователи - Календарь
Полная версия: Двусвязный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Rocket
В программе приведены различные операции с двусвязным списком.
Настораживают два пункта: добавление(добавляет всё время за первым добавленным) и удаление(удаляет всё время элементы по порядку после первого). Явно косяки... Прошу посмотреть. smile.gif
мисс_граффити
что за интересная конструкция?
    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
Цитата(мисс_граффити @ 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;

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



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

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

в цикле должен быть только переход на следующий элемент.
а вот дальше, если мы нашли, что собираемся удалять (как в односвязных - у тебя ж была логическая переменная), то удаляем...
кстати, не забудь, что перекидывать надо не 1, а 2 указателя.
Rocket
Цитата(мисс_граффити @ 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;


Ещё раз спасибо!
Зы Но всё-таки, почему новый элемент всё время добавляется после первого?
мисс_граффити
посмотрела внимательнее.
во-первых, у тебя не совсем правильно работает очистка списка. надо
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
Реализация двусвязног списка
buytask.ru/task767.html
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.