![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Не могу никак в программе написать,чтоб удаляла первый и последний элемент. Надо сделать так,чтобы после вывода списка(после его формирования) он автоматически удалял сразу первый и последний элемент.А у меня он запрашивает еще какой элемент удалить и т.п.
У кого есть желание помочь переписать мне ее,жду ваше сообщение.Заранее спасибо!!! Задание само звучало так:сформировать список из двунаправленных элементов,вывести этот список и удалить в нем первый и последний элемент. Код:
program Project1; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var Uk1,Uk2,mesto:sv; isk:int; begin Writeln ('Enter a value list: '); formirovanie (Uk1,Uk2); writeln; Writeln ('List: '); Print(Uk1,Uk2); writeln; Write ('Enter the desired value: '); readln(isk); if search_back (Uk2,isk,mesto) then writeln('Element "',mesto^.element,'" is found') else writeln ('not found'); writeln; del(mesto,Uk1,Uk2); writeln; Print(Uk1,Uk2); readln; end. unit Unit1; interface type Int = integer; sv= ^zveno; zveno= Record element: int; sled: sv; pred: sv; end; procedure formirovanie (out Uk1: sv; out Uk2: sv); Procedure print (const Uk1: sv; const Uk2: sv); function search_back (const Uk2:sv; const isk:int; out mesto:sv):boolean; procedure del (mesto: sv; var Uk1:sv; var Uk2:sv); implementation {Формирование двунаправленнного списка Дано: - Найти: Uk1 - указатель на первое звено списка Uk2 - указатель на конец списка Дополнительно: Ukrab - рабочий указатель; elem - вводимый элемент} procedure formirovanie (out Uk1: sv; out Uk2: sv); var Ukrab: sv; elem: int; begin New (Uk1); Uk1^.Sled:=nil; Uk1^.Pred:=nil; Ukrab:=Uk1; readln(elem); while elem<>0 do begin New (Ukrab^.Sled); Ukrab^.Sled^.Pred:=Ukrab; Ukrab^.Element:=Elem; Ukrab:=Ukrab^.Sled; Ukrab^.Sled:=nil; readln(elem); end; Uk2:=Ukrab; end; {Вывод списка на экран в прямом направлении Дано: Uk1 - указатель на первое звено списка Найти: вывести список в прямом направлении Дополнительно: Ukrab - рабочий указатель} procedure print (const Uk1: sv; const Uk2: sv); var Ukrab : sv; begin if (Uk1=nil)and(Uk2=nil) then writeln ('The list is empty!') else begin Ukrab:=Uk1; while Ukrab.sled <> nil do begin Write(Ukrab^.element,' '); Ukrab := Ukrab^.sled end; end; end; {поиск звена с заданнным значение Дано: Uk2 - указатель на конец списка isk - заданное значение Найти: mesto - искомое звено Дополнительно: Дополнительно: Ukrab - рабочий указатель b - логич. переменная, если звено найдено T, иначе F} function search_back (const Uk2:sv; const isk:int; out mesto:sv):boolean; var Ukrab:sv; b:boolean; begin b:=false; Ukrab:=Uk2; mesto:=Nil; While (Ukrab<>nil) and (not b) do begin If Ukrab^.Element=isk then begin b:=true; Mesto:=Ukrab end else Ukrab:=Ukrab^.Pred; end; search_back:=b; end; {Удаляет звено заданного указателем Дано: mesto - удаляемое звено Uk1 - указатель на первое звено списка Uk2 - указатель на конец списка Найти: Uk1 - указатель на первое звено списка Uk2 - указатель на конец списка} procedure del (mesto: sv; var Uk1:sv;var Uk2:sv); begin {Удаляемое звено единственное} if (mesto^.sled^.sled=nil) and (mesto^.pred=nil) then begin Uk1:=nil; Uk2:=nil; dispose(mesto); end; {Удаляемое звено - последнее! } If mesto^.Sled=Nil then begin mesto^.Pred^.Sled:=Nil; Uk2:=Uk2^.Pred; Dispose (mesto); end; {Удаляемое звено - первое (но не последнее!)} if (mesto^.sled^.sled<>nil) and (mesto^.pred=nil) then begin mesto^.sled^.pred:=nil; Uk1:=mesto^.sled; dispose(mesto); end; {Удаляемое звено внутри списка} If (mesto^.sled<>Nil) and (mesto^.pred<>Nil)then begin mesto^.Sled^.Pred:=mesto^.Pred; mesto^.Pred^.Sled:=mesto^.Sled; Dispose (mesto); end; end; end. |
#2
|
|||
|
|||
![]() Ну что,мне кто-нибудь поможет???
![]() |
#3
|
|||
|
|||
![]() Цитата:
потом найти ту строчку, что отвечает за удаление и применить на неё мозг Unit1 можно не трогать, если там нет ошибок |
#4
|
|||
|
|||
![]() Обычно для двусвязанных списков хранят указатели на голову и хвост списка. Соответственно,
Код:
type PLinkedListItem = ^ TLinkedListItem; TLinkedListItem = record Data : Integer; Next : PLinkedListItem; Prev : PLinkedListItem; end; var PHead : PLinedListItem; PTail : PLinedListItem; procedure RemoveFirst; var PItem : PLinedListItem; begin If PHead <> Nil Then Begin PItem := PHead; PHead := PHead.Next; PHead.Prev := Nil; If PTail = PItem Then PTail := Nil; Dispose(PItem); End; end; Удаление делается по аналогии. |
#5
|
|||
|
|||
![]() Цитата:
надо просто переделать процедуру дел так,чтобы удалял элементы сразу,а не по запросу. Там надо присвоить указателю значение первого элемента, и удалить его, а потом присвоить значение последнего элемента, и тоже его удалить..Я просто не знаю как это записать... |
#6
|
|||
|
|||
![]() del удаляет тот, что передан её параметром, никаких вопросов не задаёт, её надо не переписывать, а правильно использовать
|
#7
|
|||
|
|||
![]() Цитата:
Вы не совсем правильно поняли что я хотела.. |
#8
|
|||
|
|||
![]() Цитата:
Код:
mesto := Uk1; |