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
public
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
.