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

📄 dtstlist.dpr

📁 Eazy Data Structures library for Delphi.
💻 DPR
📖 第 1 页 / 共 2 页
字号:
            NewDList.Iterate(PrintStrs, true, nil);
          finally
            NewDList.Free;
          end;{try..finally}
          WriteLog('...splitting original list at "four" onwards');
          Cursor := SetBeforeFirst;
          for i := 1 to 4 do
            Cursor := Next(Cursor);
          NewDList := Split(Cursor);
          try
            WriteLog('...iterating original');
            WriteLog('...(should read one..three)');
            Iterate(PrintStrs, false, nil);
            WriteLog('...iterating split-off list');
            WriteLog('...(should read four..ten)');
            NewDList.Iterate(PrintStrs, false, nil);
            WriteLog('...joining split-off list in between one and two');
            Cursor := Next(SetBeforeFirst);
            Join(Cursor, NewDList);
            NewDList := nil;
            WriteLog('...iterating original');
            WriteLog('...(should read one,four..ten,two,three)');
            Iterate(PrintStrs, false, nil);
          finally
            NewDList.Free;
          end;{try..finally}
          Empty;
          WriteLog('...end of test 2');
        end;

      WriteLog('Third test: various basic navigation tests');
      with DList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            InsertBefore(SetAfterLast, EZStrNew(NumToName(i)));
          WriteLog('...first element');
          Cursor := Next(SetBeforeFirst);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...last element');
          Cursor := Prev(SetAfterLast);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...using Next to move forward from start');
          WriteLog('...(should read one..ten)');
          Cursor := Next(SetBeforeFirst);
          while not IsAfterLast(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Next(Cursor);
            end;
          WriteLog('...using Prev to move backwards from end');
          WriteLog('...(should read ten..one)');
          Cursor := Prev(SetAfterLast);
          while not IsBeforeFirst(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Prev(Cursor);
            end;
          Empty;
          WriteLog('...end of test 3');
        end;

      WriteLog('Fourth test: miscellaneous');
      with DList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            InsertBefore(SetAfterLast, EZStrNew(NumToName(i)));
          WriteLog('...replace three with eleven');
          Cursor := Next(Next(Next(SetBeforeFirst)));
          S := PEZString(Replace(Cursor, 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
      DList.Free;
    end;

    WriteLog('-----------DOUBLE LINKED LIST (sorted)-----------');
    DList := nil;
    try
      WriteLog('First test: insertion & deletion');
      DList := TDList.Create(true);
      with DList 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)');
          Cursor := Prev(SetAfterLast);
          Erase(Cursor);
          Cursor := Prev(Prev(SetAfterLast));
          Erase(Cursor);
          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 DList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            InsertSorted(EZStrNew(NumToName(i)));
          WriteLog('...creating clone');
          NewDList := TDList.Clone(DList, true, Compare);
          try
            WriteLog('...iterating clone backwards');
            WriteLog('...(should read two,three,ten,six,seven,one,nine,four,five,eight)');
            NewDList.Iterate(PrintStrs, true, nil);
          finally
            NewDList.Free;
          end;{try..finally}
          WriteLog('...splitting original list at "nine" onwards');
          Cursor := SetBeforeFirst;
          for i := 1 to 4 do
            Cursor := Next(Cursor);
          NewDList := Split(Cursor);
          try
            WriteLog('...iterating original');
            WriteLog('...(should read eight,five,four)');
            Iterate(PrintStrs, false, nil);
            WriteLog('...iterating split-off list');
            WriteLog('...(should read nine,one,seven,six,ten,three,two)');
            NewDList.Iterate(PrintStrs, false, nil);
            WriteLog('...joining split-off list in between eight and five');
            Cursor := Next(SetBeforeFirst);
            Join(Cursor, NewDList);
            NewDList := nil;
            WriteLog('...iterating original');
            WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
            Iterate(PrintStrs, false, nil);
          finally
            NewDList.Free;
          end;{try..finally}
          Empty;
          WriteLog('...end of test 2');
        end;

      WriteLog('Third test: various basic navigation tests');
      with DList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            InsertSorted(EZStrNew(NumToName(i)));
          WriteLog('...first element');
          Cursor := Next(SetBeforeFirst);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...last element');
          Cursor := Prev(SetAfterLast);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...using Next to move forward from start');
          WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
          Cursor := Next(SetBeforeFirst);
          while not IsAfterLast(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Next(Cursor);
            end;
          WriteLog('...using Prev to move backwards from end');
          WriteLog('...(should read two,three,ten,six,seven,one,nine,four,five,eight)');
          Cursor := Prev(SetAfterLast);
          while not IsBeforeFirst(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Prev(Cursor);
            end;
          Empty;
          WriteLog('...end of test 3');
        end;

      WriteLog('Fourth test: miscellaneous');
      with DList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            InsertSorted(EZStrNew(NumToName(i)));
          WriteLog('...replace four with eleven');
          Cursor := Next(Next(Next(SetBeforeFirst)));
          S := PEZString(Replace(Cursor, EZStrNew(NumToName(11))));
          WriteLog('...string returned ' + S^);
          EZStrDispose(S);
          WriteLog('...iterate');
          WriteLog('...(should read eight,eleven,five,nine,one,seven,six,ten,three,two)');
          Iterate(PrintStrs, false, nil);
          Empty;
          WriteLog('...end of test 4');
        end;

      WriteLog('Fifth test: megatest');
      with DList do
        begin
          WriteLog('...inserting 10,000 random strings');
          StartTime := GetTickCount;
          for i := 1 to 10000 do
            begin
              SavedS := RandomStr(10+Random(15));
              InsertSorted(EZStrNew(SavedS));
            end;
          WriteLog(IntToStr(GetTickCount));
          WriteLog(IntToStr(StartTime));
          WriteLog('...reading strings, checking sequence');
          SavedS := '';
          Cursor := Next(SetBeforeFirst);
          while not IsAfterLast(Cursor) do
            begin
              S := PEZString(Examine(Cursor));
              if (SavedS >= S^) then
                WriteLog('sequence error');
              SavedS := S^;
              Cursor := Next(Cursor);
            end;
          WriteLog('...end of test 5');
        end;
    finally
      DList.Free;
    end;

    WriteLog('-----------SKIP LIST-----------');
    SkipList := nil;
    try
      WriteLog('First test: insertion & deletion');
      SkipList := TSkipList.Create(true);
      with SkipList do
        begin
          Compare := EZStrCompare;
          DupData := EZStrDupData;
          DisposeData := EZStrDisposeData;
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            Insert(Cursor, 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)');
          Cursor := Prev(SetAfterLast);
          Erase(Cursor);
          Cursor := Prev(Prev(SetAfterLast));
          Erase(Cursor);
          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 SkipList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            Insert(Cursor, EZStrNew(NumToName(i)));
          WriteLog('...creating clone');
          NewSkipList := TSkipList.Clone(SkipList, true, Compare);
          try
            WriteLog('...iterating clone backwards');
            WriteLog('...(should read two,three,ten,six,seven,one,nine,four,five,eight)');
            NewSkipList.Iterate(PrintStrs, true, nil);
          finally
            NewSkipList.Free;
          end;{try..finally}
          WriteLog('...splitting original list at "nine" onwards');
          Cursor := SetBeforeFirst;
          for i := 1 to 4 do
            Cursor := Next(Cursor);
          NewSkipList := Split(Cursor);
          try
            WriteLog('...iterating original');
            WriteLog('...(should read eight,five,four)');
            Iterate(PrintStrs, false, nil);
            WriteLog('...iterating split-off list');
            WriteLog('...(should read nine,one,seven,six,ten,three,two)');
            NewSkipList.Iterate(PrintStrs, false, nil);
            WriteLog('...joining split-off list in between eight and five');
            Cursor := Next(SetBeforeFirst);
            Join(NewSkipList);
            NewSkipList := nil;
            WriteLog('...iterating original');
            WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
            Iterate(PrintStrs, false, nil);
          finally
            NewSkipList.Free;
          end;{try..finally}
          Empty;
          WriteLog('...end of test 2');
        end;

      WriteLog('Third test: various basic navigation tests');
      with SkipList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            Insert(Cursor, EZStrNew(NumToName(i)));
          WriteLog('...first element');
          Cursor := Next(SetBeforeFirst);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...last element');
          Cursor := Prev(SetAfterLast);
          WriteLog(PEZString(Examine(Cursor))^);
          WriteLog('...using Next to move forward from start');
          WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
          Cursor := Next(SetBeforeFirst);
          while not IsAfterLast(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Next(Cursor);
            end;
          WriteLog('...using Prev to move backwards from end');
          WriteLog('...(should read two,three,ten,six,seven,one,nine,four,five,eight)');
          Cursor := Prev(SetAfterLast);
          while not IsBeforeFirst(Cursor) do
            begin
              WriteLog(PEZString(Examine(Cursor))^);
              Cursor := Prev(Cursor);
            end;
          Empty;
          WriteLog('...end of test 3');
        end;

      WriteLog('Fourth test: miscellaneous');
      with SkipList do
        begin
          WriteLog('...inserting names of numbers');
          for i := 1 to 10 do
            Insert(Cursor, EZStrNew(NumToName(i)));
          WriteLog('...replace four with eleven');
          Cursor := Next(Next(Next(SetBeforeFirst)));
          S := PEZString(Replace(Cursor, EZStrNew(NumToName(11))));
          WriteLog('...string returned ' + S^);
          EZStrDispose(S);
          WriteLog('...iterate');
          WriteLog('...(should read eight,eleven,five,nine,one,seven,six,ten,three,two)');
          Iterate(PrintStrs, false, nil);
          Empty;
          WriteLog('...end of test 4');
        end;

      WriteLog('Fifth test: megatest');
      with SkipList do
        begin
          WriteLog('...inserting 30,000 random strings');
          StartTime := GetTickCount;
          for i := 1 to 30000 do
            begin
              SavedS := RandomStr(10+Random(15));
              Insert(Cursor, EZStrNew(SavedS));
            end;
          WriteLog(IntToStr(GetTickCount));
          WriteLog(IntToStr(StartTime));
          WriteLog('...reading strings, checking sequence');
          SavedS := '';
          Cursor := Next(SetBeforeFirst);
          while not IsAfterLast(Cursor) do
            begin
              S := PEZString(Examine(Cursor));
              if (SavedS >= S^) then
                WriteLog('sequence error');
              SavedS := S^;
              Cursor := Next(Cursor);
            end;
          WriteLog('...end of test 5');
        end;
    finally
      SkipList.Free;
    end;
  finally
    CloseLog;
  end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -