Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Двунаправленные списки (http://www.tehnari.ru/f41/t74286/)

Say 31.05.2012 20:49

Двунаправленные списки
 
Не могу никак в программе написать,чтоб удаляла первый и последний элемент. Надо сделать так,чтобы после вывода списка(после его формирования) он автоматически удалял сразу первый и последний элемент.А у меня он запрашивает еще какой элемент удалить и т.п.
У кого есть желание помочь переписать мне ее,жду ваше сообщение.Заранее спасибо!!!

Задание само звучало так:сформировать список из двунаправленных элементов,вывести этот список и удалить в нем первый и последний элемент

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.

Срочно:tehnari_ru_138:


Часовой пояс GMT +4, время: 20:44.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.