![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Встала задача при работе с однонаправленным списком удалить из него элементы если они меньше 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
|
|||
|
|||
|
На предыдущий здесь не посмотрите. Поэтому наоборот смотрите на шаг вперед. Что то вроде...
Код:
if Elem^.sled.inf < 5 then Begin T:=Elem^.sled; Elem^.sled:=T^.sled.sled; Dispose(T); End; |
|
#3
|
|||
|
|||
|
теперь удаляет нужный элемент , но и с ним удаляет последующий, либо же на него теряется ссылка, буду разбиратся.
Так, лишний .sled в T^.sled.sled;. Удаляет не всегда правильно(после удаленного элемента выводится последующий даже если он <5), и теперь иногда консольное приложение вылетает без вывода какой либо ошибки Последний раз редактировалось kaizer131, 10.02.2010 в 14:24. |
|
#4
|
|||
|
|||
|
Да, еще вылетает потому, что пытается получить значение следующего элемента, а оно может оказаться уже nil поэтому необходимо изменить условия цикла ну или проверку делать о доступности след. элемента.
|
|
#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:=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
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Забыл
Код:
readln;
// очистить память
while Beg <> nil do
Dispose(RopFirst(Beg));
end. |