program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TJList = record
key : UInt32;
next : Pointer;
end;
type
TJListClass = Class
public
constructor Create( k : Uint32);
procedure Add( k : UInt32 );
procedure AddAfterElement( k : UInt32; i : UInt32 );
procedure RemoveKeysFromList( k : UInt32 );
procedure Show;
protected
ptr : Pointer;
first : Pointer;
End;
constructor TJListClass.Create( k : UInt32 );
var
list : Pointer;
begin
list := AllocMem(SizeOf(TJList));
TJList(list^).key := k;
TJList(list^).next := nil;
Self.ptr := list;
Self.first := list;
end;
procedure TJListClass.Add( k : UInt32 );
var
list : Pointer;
begin
list := AllocMem(SizeOf(TJList));
TJList(list^).key := k;
TJList(list^).next := nil;
TJList(Self.ptr^).next := list;
Self.ptr := list;
end;
procedure TJListClass.RemoveKeysFromList( k : UInt32 );
var
tmp : Pointer;
m, n : Pointer;
begin
tmp := first;
repeat
if TJList(TJList(tmp^).next^).key = k then
begin
TJList(tmp^).next := TJList(TJList(tmp^).next^).next;
ReallocMem( tmp, SizeOf(TJList) );
RemoveKeysFromList(k);
Exit;
end;
tmp := TJList(tmp^).next;
until TJList(tmp^).next = nil;
end;
procedure TJListClass.AddAfterElement( k : UInt32; i : UInt32 );
var
tmp, list : Pointer;
x : Int32;
begin
x := 0;
tmp := first;
repeat
if i = x then
begin
list := AllocMem(SizeOf(TJList));
TJList(list^).key := k;
TJList(list^).next := TJList(tmp^).next;
TJList(tmp^).next := list;
Exit;
end;
tmp := TJList(tmp^).next;
inc(x);
until TJList(tmp^).next = nil;
if i = x then
begin
list := AllocMem(SizeOf(TJList));
TJList(list^).key := k;
TJList(list^).next := TJList(tmp^).next;
TJList(tmp^).next := list;
end;
end;
procedure TJListClass.Show;
var
tmp : Pointer;
begin
tmp := first;
repeat
Writeln( TJList(tmp^).key );
tmp := TJList(tmp^).next;
until TJList(tmp^).next = nil;
Writeln( TJList(tmp^).key );
end;
var
list : TJListClass;
begin
try
list := TJListClass.Create( 1 );
list.Add( 2 );
list.Add( 3 );
list.Add( 4 );
list.AddAfterElement( 1, 0 );
list.AddAfterElement( 2, 2 );
list.AddAfterElement( 3, 4 );
list.AddAfterElement( 4, 6 );
list.RemoveKeysFromList( 3 );
list.Show;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.