program ideone;
{$MODE OBJFPC}{$LONGSTRINGS ON}
uses
HeapTrc;
type
PNode = ^ TNode;
TNode = record
Next: PNode;
Prev: PNode;
Data: UInt8;
end ;
procedure CreateList( out AHead: PNode; const AData: array of UInt8) ;
var
LLast, LNew: PNode;
LIndex: Integer ;
begin
New ( AHead) ;
AHead^ . Next : = nil ;
AHead^ . Prev : = nil ;
AHead^ . Data : = AData[ 0 ] ;
LLast : = AHead;
for LIndex : = 1 to High( AData) do
begin
New ( LNew) ;
LNew^ . Next : = nil ;
LNew^ . Prev : = LLast;
LNew^ . Data : = AData[ LIndex] ;
LLast^ . Next : = LNew;
LLast : = LNew;
end ;
end ;
procedure DisposeList( var AHead: PNode) ;
var
LToDispose: PNode;
begin
while AHead <> nil do
begin
LToDispose : = AHead;
AHead : = AHead^ . Next ;
Dispose ( LToDispose) ;
end ;
AHead : = nil ;
end ;
procedure SplitList( const ALeftHead: PNode; out ARightHead: PNode; ACutAfter: Integer ) ;
var
LLeftLast: PNode;
begin
LLeftLast : = ALeftHead;
while ACutAfter > 0 do
begin
LLeftLast : = LLeftLast^ . Next ;
Dec( ACutAfter) ;
end ;
ARightHead : = LLeftLast^ . Next ;
ARightHead^ . Prev : = nil ;
LLeftLast^ . Next : = nil ;
end ;
procedure ShowList( AHead: PNode) ;
begin
Write ( 'from head to tail: ' ) ;
while AHead^ . Next <> nil do
begin
Write ( AHead^ . Data : 2 ) ;
AHead : = AHead^ . Next ;
end ;
WriteLn ( AHead^ . Data : 2 ) ;
Write ( 'from tail to head: ' ) ;
while AHead <> nil do
begin
Write ( AHead^ . Data : 2 ) ;
AHead : = AHead^ . Prev ;
end ;
WriteLn ( LineEnding) ;
end ;
var
LLeftHead, LRightHead: PNode;
begin
CreateList( LLeftHead, [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ) ;
ShowList( LLeftHead) ;
SplitList( LLeftHead, LRightHead, 6 ) ;
ShowList( LLeftHead) ;
ShowList( LRightHead) ;
DisposeList( LLeftHead) ;
DisposeList( LRightHead) ;
end .
cHJvZ3JhbSBpZGVvbmU7Cgp7JE1PREUgT0JKRlBDfXskTE9OR1NUUklOR1MgT059Cgp1c2VzCiAgSGVhcFRyYzsKCnR5cGUKICBQTm9kZSA9IF5UTm9kZTsKICBUTm9kZSA9IHJlY29yZAogICAgTmV4dDogUE5vZGU7CiAgICBQcmV2OiBQTm9kZTsKICAgIERhdGE6IFVJbnQ4OwogIGVuZDsKCiAgcHJvY2VkdXJlIENyZWF0ZUxpc3Qob3V0IEFIZWFkOiBQTm9kZTsgY29uc3QgQURhdGE6IGFycmF5IG9mIFVJbnQ4KTsKICB2YXIKICAgIExMYXN0LCBMTmV3OiBQTm9kZTsKICAgIExJbmRleDogSW50ZWdlcjsKICBiZWdpbgogICAgTmV3KEFIZWFkKTsKICAgIEFIZWFkXi5OZXh0IDo9IG5pbDsKICAgIEFIZWFkXi5QcmV2IDo9IG5pbDsKICAgIEFIZWFkXi5EYXRhIDo9IEFEYXRhWzBdOwoKICAgIExMYXN0IDo9IEFIZWFkOwoKICAgIGZvciBMSW5kZXggOj0gMSB0byBIaWdoKEFEYXRhKSBkbwogICAgYmVnaW4KICAgICAgTmV3KExOZXcpOwogICAgICBMTmV3Xi5OZXh0IDo9IG5pbDsKICAgICAgTE5ld14uUHJldiA6PSBMTGFzdDsKICAgICAgTE5ld14uRGF0YSA6PSBBRGF0YVtMSW5kZXhdOwoKICAgICAgTExhc3ReLk5leHQgOj0gTE5ldzsKICAgICAgTExhc3QgOj0gTE5ldzsKICAgIGVuZDsKICBlbmQ7CgogIHByb2NlZHVyZSBEaXNwb3NlTGlzdCh2YXIgQUhlYWQ6IFBOb2RlKTsKICB2YXIKICAgIExUb0Rpc3Bvc2U6IFBOb2RlOwogIGJlZ2luCiAgICB3aGlsZSBBSGVhZCA8PiBuaWwgZG8KICAgIGJlZ2luCiAgICAgIExUb0Rpc3Bvc2UgOj0gQUhlYWQ7CiAgICAgIEFIZWFkIDo9IEFIZWFkXi5OZXh0OwoKICAgICAgRGlzcG9zZShMVG9EaXNwb3NlKTsKICAgIGVuZDsKCiAgICBBSGVhZCA6PSBuaWw7CiAgZW5kOwoKICBwcm9jZWR1cmUgU3BsaXRMaXN0KGNvbnN0IEFMZWZ0SGVhZDogUE5vZGU7IG91dCBBUmlnaHRIZWFkOiBQTm9kZTsgQUN1dEFmdGVyOiBJbnRlZ2VyKTsKICB2YXIKICAgIExMZWZ0TGFzdDogUE5vZGU7CiAgYmVnaW4KICAgIExMZWZ0TGFzdCA6PSBBTGVmdEhlYWQ7CgogICAgd2hpbGUgQUN1dEFmdGVyID4gMCBkbwogICAgYmVnaW4KICAgICAgTExlZnRMYXN0IDo9IExMZWZ0TGFzdF4uTmV4dDsKICAgICAgRGVjKEFDdXRBZnRlcik7CiAgICBlbmQ7CgogICAgQVJpZ2h0SGVhZCA6PSBMTGVmdExhc3ReLk5leHQ7CiAgICBBUmlnaHRIZWFkXi5QcmV2IDo9IG5pbDsKCiAgICBMTGVmdExhc3ReLk5leHQgOj0gbmlsOwogIGVuZDsKCiAgcHJvY2VkdXJlIFNob3dMaXN0KEFIZWFkOiBQTm9kZSk7CiAgYmVnaW4KICAgIFdyaXRlKCdmcm9tIGhlYWQgdG8gdGFpbDogJyk7CgogICAgd2hpbGUgQUhlYWReLk5leHQgPD4gbmlsIGRvCiAgICBiZWdpbgogICAgICBXcml0ZShBSGVhZF4uRGF0YToyKTsKICAgICAgQUhlYWQgOj0gQUhlYWReLk5leHQ7CiAgICBlbmQ7CgogICAgV3JpdGVMbihBSGVhZF4uRGF0YToyKTsKICAgIFdyaXRlKCdmcm9tIHRhaWwgdG8gaGVhZDogJyk7CgogICAgd2hpbGUgQUhlYWQgPD4gbmlsIGRvCiAgICBiZWdpbgogICAgICBXcml0ZShBSGVhZF4uRGF0YToyKTsKICAgICAgQUhlYWQgOj0gQUhlYWReLlByZXY7CiAgICBlbmQ7CgogICAgV3JpdGVMbihMaW5lRW5kaW5nKTsKICBlbmQ7Cgp2YXIKICBMTGVmdEhlYWQsIExSaWdodEhlYWQ6IFBOb2RlOwpiZWdpbgogIENyZWF0ZUxpc3QoTExlZnRIZWFkLCBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0pOwogIFNob3dMaXN0KExMZWZ0SGVhZCk7CgogIFNwbGl0TGlzdChMTGVmdEhlYWQsIExSaWdodEhlYWQsIDYpOwogIFNob3dMaXN0KExMZWZ0SGVhZCk7CiAgU2hvd0xpc3QoTFJpZ2h0SGVhZCk7CgogIERpc3Bvc2VMaXN0KExMZWZ0SGVhZCk7CiAgRGlzcG9zZUxpc3QoTFJpZ2h0SGVhZCk7CmVuZC4K