Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2010, 10:40
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
Вопрос удаление элемента из списка

Доброго времени суток.
Встала задача при работе с однонаправленным списком удалить из него элементы если они меньше 5.
Я так понимаю, что для реализации удаления необходимо знать адрес предыдущего элемента.
Мне удалось реализовать удаление элементов, стоящих за элементом который меньше 5.
Код:
program Spisok;

{$APPTYPE CONSOLE}

uses
SysUtils;

TYPE  Link = ^Zveno;
      Zveno = record
      number:integer;
      inf : Integer;
      sled : Link;
                  End;
Var
Beg, Elem, T,T2:Link;
X:integer;
i,n:integer;
begin
Randomize;
write('Vvedi dlinnu spiska : ');
readln(n);
New(Elem);
Elem^.number:=1;
Elem^.inf:=random(10);
Elem^.sled:=nil;
Beg:=Elem;

for I := 2 to n do
begin
New(elem^.sled);
Elem:=elem^.sled;
Elem^.number:=i;
Elem^.inf:=random(10);
Elem^.sled:=nil;
end;


Elem:=beg; {Назначаем начальный узел}
while Elem<>nil do
begin
write ('[') ;
write (Elem^.number) ;
write ('] ') ;
write (Elem^.inf) ;
write (' --> ') ;
Elem:=Elem^.sled;
end;

writeln;
Elem:=beg; {Назначаем начальный узел}
T:= Elem;
while Elem<>nil do
begin

/////// Вот здесь организованна проверка и удаление элемента /////////////

if Elem^.inf < 5 then
Begin
T:=Elem^.sled;
Elem^.sled:=T^.sled;
Dispose(T);
End;

/////////////////////////////////////////////////////////////////////////

write ('[') ;
write (Elem^.number) ;
write ('] ') ;
write (Elem^.inf) ;
write (' --> ') ;
Elem:=Elem^.sled;

end;

readln;
end.


Вопрос: как организовать занесение ссылки на предыдущее звено в переменную ?
Ответить с цитированием
  #2  
Старый 10.02.2010, 11:31
Vasuha Vasuha вне форума
Прохожий
 
Регистрация: 04.02.2010
Сообщения: 6
Репутация: 10
По умолчанию

На предыдущий здесь не посмотрите. Поэтому наоборот смотрите на шаг вперед. Что то вроде...

Код:
if Elem^.sled.inf < 5 then
Begin
T:=Elem^.sled;
Elem^.sled:=T^.sled.sled;
Dispose(T);
End;
Ответить с цитированием
  #3  
Старый 10.02.2010, 13:59
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

теперь удаляет нужный элемент , но и с ним удаляет последующий, либо же на него теряется ссылка, буду разбиратся.

Так, лишний .sled в T^.sled.sled;.

Удаляет не всегда правильно(после удаленного элемента выводится последующий даже если он <5), и теперь иногда консольное приложение вылетает без вывода какой либо ошибки

Последний раз редактировалось kaizer131, 10.02.2010 в 14:24.
Ответить с цитированием
  #4  
Старый 10.02.2010, 15:12
Vasuha Vasuha вне форума
Прохожий
 
Регистрация: 04.02.2010
Сообщения: 6
Репутация: 10
По умолчанию

Да, еще вылетает потому, что пытается получить значение следующего элемента, а оно может оказаться уже nil поэтому необходимо изменить условия цикла ну или проверку делать о доступности след. элемента.
Ответить с цитированием
  #5  
Старый 11.02.2010, 08:36
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Так вроде поправил,
Код:
program Spisok;
{$APPTYPE CONSOLE}
uses
SysUtils;

TYPE  Link = ^Zveno;
      Zveno = record
      number:integer;
      inf : Integer;
      sled : Link;
                  End;
Var
Beg, Elem, T,T2:Link;
X:integer;
i,n:integer;
begin
Randomize;
write('Vvedi dlinnu spiska : ');
readln(n);
New(Elem);
Elem^.number:=1;
Elem^.inf:=6;
Elem^.sled:=nil;
Beg:=Elem;

for I := 2 to n do
begin
New(elem^.sled);
Elem:=elem^.sled;
Elem^.number:=i;
Elem^.inf:=random(10);
Elem^.sled:=nil;
end;
Elem:=beg; {Назначаем начальный узел}
while Elem<>nil do
begin
write ('[') ;
write (Elem^.number) ;
write ('] ') ;
write (Elem^.inf) ;
write (' --> ') ;
Elem:=Elem^.sled;
end;
writeln;
Elem:=beg; {Назначаем начальный узел}

while Elem<>nil do
begin
if (Elem^.sled <> nil) and (Elem^.inf<5) then
begin
T:=Elem;
Elem^.sled:=T^.sled;
Dispose(T);
end
else
Begin
write ('[') ;
write (Elem^.number) ;
write ('] ') ;
write (Elem^.inf) ;
write (' --> ') ;
End;
Elem:=Elem^.sled;
end;

readln;
end.

Дальше нужно реализовать проверку конца и начала списка

Последний раз редактировалось kaizer131, 11.02.2010 в 09:29.
Ответить с цитированием
  #6  
Старый 26.02.2010, 12:30
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Код:
program Spisok;
{$APPTYPE CONSOLE}
uses
  SysUtils;

type
  Link = ^Zveno;
  Zveno = record
    number: integer;
    inf: Integer;
    sled: Link;
  end;

function NewElem(number, inf: integer): Link;
begin
  New(Result);
  Result^.number := number;
  Result^.inf := inf;
  Result^.sled := nil;
end;

function RopFirst(var Elem: Link): Link;
begin
  Result := Elem;
  if Elem <> nil then
    Elem := Elem^.sled;
end;

var
  Beg, Elem, T, T2: Link;
  X: integer;
  i, n: integer;
begin
  Randomize;
  write('Vvedi dlinnu spiska : ');
  readln(n);

  Beg := NewElem(1, random(10));
  Elem := Beg;

  for I := 2 to n do
  begin
    Elem^.sled := NewElem(i, random(10));
    Elem := Elem^.sled;
  end;

  Elem := Beg; {Назначаем начальный узел}
  while Elem <> nil do
  begin
    write('[', Elem^.number, '] ', Elem^.inf, ' --> ');
    Elem := Elem^.sled;
  end;
  writeln;
  // удаление < 5

  // удаление первых
  while (Beg <> nil) and (Beg^.inf < 5) do
    Dispose(RopFirst(Beg));

  // Beg или nil или содержит >= 5
  if Beg <> nil then
  begin
    Elem := Beg; {Назначаем начальный узел}
    while Elem^.sled <> nil do
    begin
      if Elem^.sled^.inf < 5 then
        Dispose(RopFirst(Elem^.sled))
      else
        Elem := Elem^.sled;
    end;
  end;

  readln;
  
  Elem := Beg; {Назначаем начальный узел}
  while Elem <> nil do
  begin
    write('[', Elem^.number, '] ', Elem^.inf, ' --> ');
    Elem := Elem^.sled;
  end;
  writeln;
  
  readln;
end.
Ответить с цитированием
  #7  
Старый 26.02.2010, 12:34
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Забыл
Код:
  readln;
  // очистить память
  while Beg <> nil do
    Dispose(RopFirst(Beg));
end.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter