Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2012, 17:56
Nary Nary вне форума
Прохожий
 
Регистрация: 31.05.2012
Сообщения: 4
Репутация: 10
Восклицание Двунаправленный список

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

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


Код:
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  
Старый 31.05.2012, 19:41
Nary Nary вне форума
Прохожий
 
Регистрация: 31.05.2012
Сообщения: 4
Репутация: 10
Восклицание

Ну что,мне кто-нибудь поможет??? Очень надо.
Ответить с цитированием
  #3  
Старый 31.05.2012, 19:53
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
запрашивает еще какой элемент удалить и т.п.
в чём трудность удалить эти строчки,
потом найти ту строчку, что отвечает за удаление и применить на неё мозг
Unit1 можно не трогать, если там нет ошибок
Ответить с цитированием
  #4  
Старый 31.05.2012, 19:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Обычно для двусвязанных списков хранят указатели на голову и хвост списка. Соответственно,
Код:
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  
Старый 31.05.2012, 19:59
Nary Nary вне форума
Прохожий
 
Регистрация: 31.05.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
в чём трудность удалить эти строчки,
потом найти ту строчку, что отвечает за удаление и применить на неё мозг
Unit1 можно не трогать, если там нет ошибок

надо просто переделать процедуру дел так,чтобы удалял элементы сразу,а не по запросу.
Там надо присвоить указателю значение первого элемента, и удалить его, а потом присвоить значение последнего элемента, и тоже его удалить..Я просто не знаю как это записать...
Ответить с цитированием
  #6  
Старый 31.05.2012, 20:04
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

del удаляет тот, что передан её параметром, никаких вопросов не задаёт, её надо не переписывать, а правильно использовать
Ответить с цитированием
  #7  
Старый 31.05.2012, 20:06
Nary Nary вне форума
Прохожий
 
Регистрация: 31.05.2012
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
del удаляет тот, что передан её параметром, никаких вопросов не задаёт, её надо не переписывать, а правильно использовать

Вы не совсем правильно поняли что я хотела..
Ответить с цитированием
  #8  
Старый 31.05.2012, 20:19
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Там надо присвоить указателю значение первого элемента
Код:
mesto := Uk1;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025