Здравствуйте. Помогите с выводом двусвязного списка в 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.