![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
надо просто переделать процедуру дел так,чтобы удалял элементы сразу,а не по запросу. Там надо присвоить указателю значение первого элемента, и удалить его, а потом присвоить значение последнего элемента, и тоже его удалить..Я просто не знаю как это записать... |
|
#5
|
|||
|
|||
|
del удаляет тот, что передан её параметром, никаких вопросов не задаёт, её надо не переписывать, а правильно использовать
|
|
#6
|
|||
|
|||
|
Цитата:
Вы не совсем правильно поняли что я хотела.. |
|
#7
|
|||
|
|||
|
Цитата:
Код:
mesto := Uk1; |
|
#8
|
|||
|
|||
|
Обычно для двусвязанных списков хранят указатели на голову и хвост списка. Соответственно,
Код:
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;Удаление делается по аналогии. |