⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtstlist.dpr

📁 很经典的Delphi数据结构算法包,支持Delphi 1.0~ 7.0 和 Delphi 2006 ~ 2007 的win32程序.算法库稳定快速
💻 DPR
📖 第 1 页 / 共 3 页
字号:
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 + -