|
|
Регистрация | << Правила форума >> | 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. |