Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2021, 14:32   #1
Alona443
Новичок
Джуниор
 
Регистрация: 17.12.2020
Сообщений: 1
По умолчанию Двусвязный список Delphi, проблема с выводом

Здравствуйте. Помогите с выводом двусвязного списка в ListBox. Скорее всего ошибка в l_printl, но я не совсем понимаю в каком месте и как правильно записать код для вывода информации в очередности.

Ещё возникла проблема в операциях по помещению элемента после и перед выбранным в операциях l_insert_before и l_insert_after. Не знаю, как правильно обозначить выбранный элемент из ListBox и присвоить его данные переменной е.
За любую помощь буду благодарна)
Код:
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
PdlistEl = ^dlistEl;
  dlistEl = record
    next : PdlistEl;
    prev : PdlistEl;
    data : integer;
  end;
 
  dlistVar = record
    head  : PdlistEl;
    tail  : PdlistEl;
    count : cardinal;
  end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button7: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button6: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Button5: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
   
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure l_init (var L:dlistVar);
begin
L.head:=nil;
L.tail:=nil;
L.count:=0;
end;
 
procedure l_push_front ( var L:dlistVar; v:integer);
var p: PdlistEl;
begin
new(p);
p^.data:=v;
p^.prev:=nil;
p^.next:=L.head;
L.head:=p;
inc(L.count);
if p^.next<>nil then
p^.next^.prev:=p
else
L.tail:=p;
end;
 
procedure l_push_back ( var L:dlistVar; v:integer);
var
p:pdlistEl;
begin
new(p);
p^.data:=v;
p^.next:=nil;
p^.prev:=L.tail;
L.tail:=p;
inc(L.count);
if p^.prev<>nil then
p.prev.next:=p
else
L.head:=p;
end;
 
procedure l_insert_before( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin
 
  if e = L.head then l_push_front ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e;
    p^.prev :=e.prev;
    inc ( L.count );
    e.prev.next:=p;
    e.prev:=p;
  end;
end;
 
procedure l_insert_after ( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin
 
  if e = L.tail then l_push_back ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e^.next;
    p^.prev := e;
    inc ( L.count );
    e^.next^.prev := p;
    e^.next := p;
  end;
end;
 
procedure l_remove ( var L : dlistVar; e : PdlistEl );
begin
  dec ( L.count );
  if e^.prev <> nil then e^.prev^.next := e^.next
  else L.head := e^.next;
  if e^.next <> nil then e^.next^.prev := e^.prev
  else L.tail := e^.prev;
  dispose ( e );
end;
 
procedure l_pop_front ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.head );
end;
 
procedure l_pop_back ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.tail );
end;
 
procedure l_printl ( var L : dlistVar );
var
  p : pdlistEl;
begin
    p :=L.head;
    while (p <> nil) do
      begin
       Form1.ListBox1.Items.Add(IntToStr(p^.data));
    p := p^.next;
  end;
 
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_push_front(L,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_insert_before(L,L.tail,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_insert_after(L,L.head,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_push_back(L,strtoint(Edit1.text));
l_printl(L);
end;
 
 
procedure TForm1.Button7Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_remove(L,L.head.next.next);
l_printl(L);
end;
 
 
 
 
procedure TForm1.Button8Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_pop_front(L);
l_printl(L);
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_pop_back(L);
l_printl(L);
end;
 
 
end.
Изображения
Тип файла: png Zrzut ekranu 2021-01-03 043753.png (38.5 Кб, 30 просмотров)
Alona443 вне форума Ответить с цитированием
Старый 13.01.2021, 18:01   #2
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 144
По умолчанию

Поправил код, чтобы l_printl работала. Что касается l_insert_before и l_insert_after, процедуры работают, но я не знаю правильно они работают или нет, т.к. работу двусвязных списков понимаю плохо.

Код:
unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
    PdlistEl = ^dlistEl;
    dlistEl = record
            next : PdlistEl;
            prev : PdlistEl;
            data : integer;
    end;

    dlistVar = record
             head  : PdlistEl;
             tail  : PdlistEl;
             count : cardinal;
    end;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Edit1: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
var
   L : dlistVar;

implementation

{$R *.lfm}

procedure l_init (var L:dlistVar);
begin
     L.head:=nil;
     L.tail:=nil;
     L.count:=0;
end;

procedure deleteDblLinkedList(L : dlistVar);
var
  tmp: PdlistEl;
  next: PdlistEl;
begin
  tmp := L.head;
  next := nil;
  while (tmp <> nil) do
  begin
    next := tmp^.next;
    Dispose(tmp);
    tmp := next;
  end;
end;

procedure l_push_front ( var L:dlistVar; v:integer);
var
   p: PdlistEl;
begin
     p := new(PdlistEl);
     if (p = nil) then exit;
     p^.data:=v;
     p^.next:=L.head;
     p^.prev:=nil;

     if L.head<>nil then L.head^.prev:=p;
     L.head:=p;
     if L.tail=nil then L.tail:=p;
     inc(L.count);
end;

procedure l_push_back ( var L:dlistVar; v:integer);
var
   p: pdlistEl;
begin
     p := new(PdlistEl);
     if (p = nil) then exit;
     p^.data:=v;
     p^.prev:=L.tail;
     p^.next:=nil;

     if L.tail<>nil then L.tail^.next:=p;
     L.tail:=p;
     if l.head=nil then L.head:=p;
     inc(L.count);
end;

procedure l_insert_before( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin
  if e = L.head then l_push_front ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e;
    p^.prev :=e^.prev;
    inc ( L.count );
    e^.prev^.next:=p;
    e^.prev:=p;
  end;
end;

procedure l_insert_after ( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin

  if e = L.tail then l_push_back ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e^.next;
    p^.prev := e;
    inc ( L.count );
    e^.next^.prev := p;
    e^.next := p;
  end;
end;

procedure l_remove ( var L : dlistVar; e : PdlistEl );
begin

  if e^.prev <> nil then
     e^.prev^.next := e^.next
  else
      L.head := e^.next;
  if e^.next <> nil then
     e^.next^.prev := e^.prev
  else
      L.tail := e^.prev;
  dec ( L.count );
  dispose ( e );

end;

procedure l_pop_front ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.head );
end;

procedure l_pop_back ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.tail );
end;

procedure l_printl ( var L : dlistVar );
var
  p : pdlistEl;
begin
     Form1.Edit1.Text:='';
    Form1.ListBox1.Clear;
    p :=L.head;
    while (p <> nil) do
    begin
       Form1.ListBox1.Items.Add(IntToStr(p^.data));
       p := p^.next;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     l_push_front(L,strtoint(Edit1.text));
     l_printl(L);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     l_insert_before(L,L.tail,strtoint(Edit1.text));
     l_printl(L);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     l_insert_after(L,L.head,strtoint(Edit1.text));
     l_printl(L);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     l_push_back(L,strtoint(Edit1.text));
     l_printl(L);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  l_remove(L,L.head^.next^.next);
  l_printl(L);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  l_pop_front(L);
  l_printl(L);
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  l_pop_back(L);
  l_printl(L);
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  deleteDblLinkedList(L);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  l_init(L);
end;

end.
ichi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с выводом изображения (Delphi) SpaceLama Помощь студентам 2 12.10.2016 19:13
Динамика курса валют - Проблема с выводом дат (Delphi) Max1097 Помощь студентам 2 05.03.2016 08:09
Двусвязный список в виде класса. delphi Rei-li Помощь студентам 5 21.09.2011 02:51
Проблема с выводом Delphi 2009 ultrakiller Win Api 0 03.12.2009 18:43
delphi (двусвязный неупорядоченный список) KaZaaM Помощь студентам 10 27.05.2009 22:15