📄 dtstlist.dpr
字号:
program Dtstlist;
{-Test program for single/double/skip lists}
{$I EZDSLDEF.INC}
{---Place any compiler options you require here-----------------------}
{---------------------------------------------------------------------}
{$I EZDSLOPT.INC}
{$IFDEF Win32}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
{$IFDEF Win32}
Windows,
{$ELSE}
WinProcs,
WinTypes,
{$ENDIF}
SysUtils,
EZDSLCts in 'EZDSLCTS.PAS',
EZDSLBse in 'EZDSLBSE.PAS',
EZDSLLst in 'EZDSLLST.PAS',
EZDSLDbl in 'EZDSLDBL.PAS',
EZDSLSkp in 'EZDSLSKP.PAS',
EZDSLSup in 'EZDSLSUP.PAS',
DTstGen in 'DTstGen.pas';
type
//tcp包
TTCPPacket = record
TCPPacketHeader:string;
TCPData:string;
end;
PTCPPacket=^TTCPPacket;
function PrintStrs(C : TAbstractContainer;
aData : pointer;
ExtraData : pointer) : boolean; far;
var
S : PEZString absolute aData;
begin
Result := true;
WriteLog(S^);
end;
function PrintPacket(C:TAbstractContainer;aData:Pointer;ExtraData:Pointer):Boolean;far;
var
Packet:PTCPPacket absolute aData;
begin
Result := true;
WriteLog(Packet^.TCPPacketHeader+#9#9);
WriteLog(Packet^.TCPData);
end;
function TCPPacketCompare(Data1, Data2 : pointer) : integer;
begin
try
Result:=StrToInt(PTCPPacket(Data1).TCPPacketHeader)-StrToInt(PTCPPacket(Data2).TCPPacketHeader);
except
Result:=-1;
end;
end;
function TCPPacketDupData(aData : pointer) : pointer;
begin
if (aData = nil) then
Result := nil
else
begin
new(PTCPPacket(Result));
PTCPPacket(Result)^.TCPPacketHeader:=PTCPPacket(aData)^.TCPPacketHeader;
PTCPPacket(Result)^.TCPData:=PTCPPacket(aData)^.TCPData;
end;
end;
procedure TCPPacketDisposeData(aData : pointer);
begin
Dispose(PTCPPacket(aData));
end;
function NewTcpPacket(str1,str2:string):PTCPPacket;
begin
new(Result);
Result^.TCPPacketHeader:=str1;
Result^.TCPData:=str2;
end;
var
i : integer;
LinkList, NewLinkList,MyLinkList : TLinkList;
DList, NewDList : TDList;
SkipList, NewSkipList : TSkipList;
S : PEZString;
SavedS : string;
Cursor : TListCursor;
StartTime : longint;
tmpTCPPacket:TTCPPacket;
begin
OpenLog;
try
WriteLog('Starting tests');
WriteLog('-----------SINGLE LINKED LIST (unsorted)-----------');
LinkList := nil;
try
WriteLog('First test: insertion & deletion');
LinkList := TLinkList.Create(true);
with LinkList do
begin
Compare := EZStrCompare;
DupData := EZStrDupData;
DisposeData := EZStrDisposeData;
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
InsertAfter(EZStrNew(NumToName(i)));
WriteLog('...iterating them (should read ten..one)');
Iterate(PrintStrs, false, nil);
WriteLog('...delete last, third from last; iterate');
WriteLog('...(should read ten..four,two)');
SetAfterLast;
Prev;
Erase;
SetAfterLast;
Prev; Prev;
Erase;
Iterate(PrintStrs, false, nil);
WriteLog('...emptying; iterate (should be nothing)');
Empty;
Iterate(PrintStrs, false, nil);
WriteLog('...end of test 1');
end;
WriteLog('Second test: cloning, splitting and joining');
with LinkList do
begin
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
begin
SetAfterLast;
InsertBefore(EZStrNew(NumToName(i)));
end;
WriteLog('...creating clone');
NewLinkList := TLinkList.Clone(LinkList, true, Compare);
try
WriteLog('...iterating clone backwards');
WriteLog('...(should read ten..one)');
NewLinkList.Iterate(PrintStrs, true, nil);
finally
NewLinkList.Free;
end;{try..finally}
WriteLog('...splitting original list at "four" onwards');
SetBeforeFirst;
for i := 1 to 4 do
Next;
NewLinkList := Split;
try
WriteLog('...iterating original');
WriteLog('...(should read one..three)');
Iterate(PrintStrs, false, nil);
WriteLog('...iterating split-off list');
WriteLog('...(should read four..ten)');
NewLinkList.Iterate(PrintStrs, false, nil);
WriteLog('...joining split-off list in between one and two');
SetBeforeFirst; Next;
Join(NewLinkList);
NewLinkList := nil;
WriteLog('...iterating original');
WriteLog('...(should read one,four..ten,two,three)');
Iterate(PrintStrs, false, nil);
finally
NewLinkList.Free;
end;{try..finally}
Empty;
WriteLog('...end of test 2');
end;
WriteLog('Third test: various basic navigation tests');
with LinkList do
begin
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
begin
SetAfterLast;
InsertBefore(EZStrNew(NumToName(i)));
end;
WriteLog('...first element');
SetBeforeFirst;
Next;
WriteLog(PEZString(Examine)^);
WriteLog('...last element');
SetAfterLast;
Prev;
WriteLog(PEZString(Examine)^);
WriteLog('...using Next to move forward from start');
WriteLog('...(should read one..ten)');
SetBeforeFirst;
Next;
while not IsAfterLast do
begin
WriteLog(PEZString(Examine)^);
Next;
end;
WriteLog('...using Prev to move backwards from end');
WriteLog('...(should read ten..one)');
Prev;
while not IsBeforeFirst do
begin
WriteLog(PEZString(Examine)^);
Prev;
end;
Empty;
WriteLog('...end of test 3');
end;
WriteLog('Fourth test: miscellaneous');
with LinkList do
begin
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
begin
SetAfterLast;
InsertBefore(EZStrNew(NumToName(i)));
end;
WriteLog('...replace three with eleven');
SetBeforeFirst;
Next; Next; Next;
S := PEZString(Replace(EZStrNew(NumToName(11))));
WriteLog('...string returned ' + S^);
EZStrDispose(S);
WriteLog('...iterate (should read one,two,eleven,four..ten)');
Iterate(PrintStrs, false, nil);
Empty;
WriteLog('...end of test 4');
end;
finally
LinkList.Free;
end;
WriteLog('-----------SINGLE LINKED LIST (sorted)-----------');
LinkList := nil;
try
WriteLog('First test: insertion & deletion');
LinkList := TLinkList.Create(true);
with LinkList do
begin
Compare := EZStrCompare;
DupData := EZStrDupData;
DisposeData := EZStrDisposeData;
IsSorted := true;
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
InsertSorted(EZStrNew(NumToName(i)));
WriteLog('...iterating them');
WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
Iterate(PrintStrs, false, nil);
WriteLog('...delete last, third from last; iterate');
WriteLog('...(should read eight,five,four,nine,one,seven,six,three)');
SetAfterLast;
Prev;
Erase;
SetAfterLast;
Prev; Prev;
Erase;
Iterate(PrintStrs, false, nil);
WriteLog('...emptying; iterate (should be nothing)');
Empty;
Iterate(PrintStrs, false, nil);
WriteLog('...end of test 1');
end;
WriteLog('Second test: cloning, splitting and joining');
with LinkList do
begin
WriteLog('...inserting names of numbers');
for i := 1 to 10 do
InsertSorted(EZStrNew(NumToName(i)));
WriteLog('...creating clone');
NewLinkList := TLinkList.Clone(LinkList, true, Compare);
try
WriteLog('...iterating clone backwards');
WriteLog('...(should read two,three,ten,six,seven,one,nine,four,five,eight)');
NewLinkList.Iterate(PrintStrs, true, nil);
finally
NewLinkList.Free;
end;{try..finally}
WriteLog('...splitting original list at "nine" onwards');
SetBeforeFirst;
for i := 1 to 4 do
Next;
NewLinkList := Split;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -