Advertisement
Guest User

Lista jednokierunkowa - Furious Programming

a guest
Jan 11th, 2014
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.70 KB | None | 0 0
  1. unit List;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Classes;
  7.  
  8. type
  9.   TData = Cardinal;
  10.  
  11. type
  12.   PElement = ^TElement;
  13.   TElement = record
  14.     Next: PElement;
  15.     Data: TData;
  16.   end;
  17.  
  18. const
  19.   ELEMENT_DATA_SIZE = SizeOf(TData);
  20.  
  21. type
  22.   TSimpleList = class(TObject)
  23.   private
  24.     FFirst: PElement;
  25.     FLast: PElement;
  26.     FCount: Cardinal;
  27.     FCapacity: Cardinal;
  28.   protected
  29.     procedure ZeroFields();
  30.     procedure CreateElement(AData: TData; out AElement: PElement);
  31.     procedure FindByIndex(AIndex: Cardinal; out APrevious, AToken: PElement);
  32.   public
  33.     constructor Create();
  34.     destructor Destroy(); override;
  35.   public
  36.     procedure Add(AData: TData);
  37.     procedure Insert(AIndex: Cardinal; AData: TData);
  38.     procedure Remove(AIndex: Cardinal);
  39.     procedure Clear();
  40.   public
  41.     function Read(AIndex: Cardinal): TData;
  42.     function Find(AData: TData): Integer;
  43.   public
  44.     procedure Print();
  45.   public
  46.     procedure SaveToFile(AFileName: TFileName);
  47.     procedure LoadFromFile(AFileName: TFileName; AAppend: Boolean = False);
  48.   public
  49.     property Count: Cardinal read FCount;
  50.     property Capacity: Cardinal read FCapacity;
  51.   end;
  52.  
  53.  
  54. implementation
  55.  
  56.  
  57.   constructor TSimpleList.Create();
  58.   begin
  59.     inherited Create();
  60.     ZeroFields();
  61.   end;
  62.  
  63.   destructor TSimpleList.Destroy();
  64.   begin
  65.     Clear();
  66.     inherited Destroy();
  67.   end;
  68.  
  69.   procedure TSimpleList.ZeroFields();
  70.   begin
  71.     FFirst := nil;
  72.     FLast := nil;
  73.     FCount := 0;
  74.     FCapacity := 0;
  75.   end;
  76.  
  77.   procedure TSimpleList.CreateElement(AData: TData; out AElement: PElement);
  78.   begin
  79.     New(AElement);
  80.     AElement^.Next := nil;
  81.     AElement^.Data := AData;
  82.   end;
  83.  
  84.   procedure TSimpleList.FindByIndex(AIndex: Cardinal; out APrevious, AToken: PElement);
  85.   begin
  86.     AToken := FFirst;
  87.     APrevious := nil;
  88.  
  89.     while AIndex > 0 do
  90.     begin
  91.       APrevious := AToken;
  92.       AToken := AToken^.Next;
  93.       Dec(AIndex);
  94.     end;
  95.   end;
  96.  
  97.   procedure TSimpleList.Add(AData: TData);
  98.   var
  99.     peNew: PElement;
  100.   begin
  101.     CreateElement(AData, peNew);
  102.  
  103.     if FFirst = nil then
  104.     begin
  105.       FFirst := peNew;
  106.       FLast := peNew;
  107.     end
  108.     else
  109.     begin
  110.       FLast^.Next := peNew;
  111.       FLast := peNew;
  112.     end;
  113.  
  114.     Inc(FCount);
  115.     Inc(FCapacity, ELEMENT_DATA_SIZE);
  116.   end;
  117.  
  118.   procedure TSimpleList.Insert(AIndex: Cardinal; AData: TData);
  119.   var
  120.     peNew, peToken, pePrevious: PElement;
  121.   begin
  122.     CreateElement(AData, peNew);
  123.  
  124.     if FFirst = nil then
  125.     begin
  126.       FFirst := peNew;
  127.       FLast := peNew;
  128.     end
  129.     else
  130.     begin
  131.       FindByIndex(AIndex, pePrevious, peToken);
  132.  
  133.       if peToken = FFirst then
  134.       begin
  135.         peNew^.Next := FFirst;
  136.         FFirst := peNew;
  137.       end
  138.       else
  139.       begin
  140.         pePrevious^.Next := peNew;
  141.         peNew^.Next := peToken;
  142.  
  143.         if peNew^.Next = nil then
  144.           FLast := peNew;
  145.       end;
  146.     end;
  147.  
  148.     Inc(FCount);
  149.     Inc(FCapacity, ELEMENT_DATA_SIZE);
  150.   end;
  151.  
  152.   procedure TSimpleList.Remove(AIndex: Cardinal);
  153.   var
  154.     peToken, pePrevious: PElement;
  155.   begin
  156.     if AIndex = 0 then
  157.     begin
  158.       peToken := FFirst;
  159.       FFirst := FFirst^.Next;
  160.  
  161.       if FFirst = nil then
  162.         FLast := nil;
  163.     end
  164.     else
  165.     begin
  166.       FindByIndex(AIndex, pePrevious, peToken);
  167.  
  168.       if peToken^.Next = nil then
  169.       begin
  170.         FLast := pePrevious;
  171.         pePrevious^.Next := nil;
  172.       end
  173.       else
  174.         pePrevious^.Next := peToken^.Next;
  175.     end;
  176.  
  177.     Dispose(peToken);
  178.     Dec(FCount);
  179.     Dec(FCapacity, ELEMENT_DATA_SIZE);
  180.   end;
  181.  
  182.   procedure TSimpleList.Clear();
  183.   var
  184.     peToken, peNext: PElement;
  185.   begin
  186.     peToken := FFirst;
  187.  
  188.     while peToken <> nil do
  189.     begin
  190.       peNext := peToken^.Next;
  191.       Dispose(peToken);
  192.       peToken := peNext;
  193.     end;
  194.  
  195.     ZeroFields();
  196.   end;
  197.  
  198.   function TSimpleList.Read(AIndex: Cardinal): TData;
  199.   var
  200.     peToken, pePrevious: PElement;
  201.   begin
  202.     FindByIndex(AIndex, pePrevious, peToken);
  203.     Result := peToken^.Data;
  204.   end;
  205.  
  206.   function TSimpleList.Find(AData: TData): Integer;
  207.   var
  208.     peToken: PElement;
  209.   begin
  210.     Result := 0;
  211.     peToken := FFirst;
  212.  
  213.     while peToken <> nil do
  214.       if peToken^.Data = AData then
  215.         Exit
  216.       else
  217.       begin
  218.         peToken := peToken^.Next;
  219.         Inc(Result);
  220.       end;
  221.  
  222.     Result := -1;
  223.   end;
  224.  
  225.   procedure TSimpleList.Print();
  226.   var
  227.     peToken: PElement;
  228.     intIndex: Cardinal;
  229.   begin
  230.     WriteLn('Count:    ', FCount);
  231.     WriteLn('Capacity: ', FCapacity, ' bytes'#10);
  232.  
  233.     peToken := FFirst;
  234.     intIndex := 0;
  235.  
  236.     while peToken <> nil do
  237.     begin
  238.       WriteLn('Index: ', intIndex:2, ' | Data: ', peToken^.Data:4);
  239.       peToken := peToken^.Next;
  240.       Inc(intIndex);
  241.     end;
  242.   end;
  243.  
  244.   procedure TSimpleList.SaveToFile(AFileName: TFileName);
  245.   var
  246.     fsOutput: TFileStream;
  247.     peToken: PElement;
  248.   begin
  249.     fsOutput := TFileStream.Create(AFileName, fmCreate or fmShareExclusive);
  250.     try
  251.       peToken := FFirst;
  252.  
  253.       while peToken <> nil do
  254.       begin
  255.         fsOutput.WriteBuffer(peToken^.Data, ELEMENT_DATA_SIZE);
  256.         peToken := peToken^.Next;
  257.       end;
  258.     finally
  259.       fsOutput.Free();
  260.     end;
  261.   end;
  262.  
  263.   procedure TSimpleList.LoadFromFile(AFileName: TFileName; AAppend: Boolean = False);
  264.   var
  265.     fsInput: TFileStream;
  266.     dtToken: TData;
  267.   begin
  268.     if not AAppend then
  269.       Clear();
  270.  
  271.     fsInput := TFileStream.Create(AFileName, fmOpenRead or fmShareExclusive);
  272.     try
  273.       while fsInput.Position < fsInput.Size do
  274.       begin
  275.         fsInput.ReadBuffer(dtToken, ELEMENT_DATA_SIZE);
  276.         Add(dtToken);
  277.       end;
  278.     finally
  279.       fsInput.Free;
  280.     end;
  281.   end;
  282.  
  283.  
  284. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement