Advertisement
babubabu

Singly Linked List

Jan 3rd, 2014
684
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.05 KB | None | 0 0
  1. unit SinglyLinkedList;
  2.  
  3. {==============================================================================}
  4.  
  5. {$mode objfpc}{$H+}
  6.  
  7. {==============================================================================}
  8.  
  9. interface
  10.  
  11. {==============================================================================}
  12.  
  13. uses
  14.   Classes, SysUtils;
  15.  
  16. {==============================================================================}
  17.  
  18. type
  19.   TData = Word;
  20.  
  21. {------------------------------------------------------------------------------}
  22.  
  23. const
  24.   ELEMENT_DATA_SIZE = SizeOf(TData);
  25.  
  26. {------------------------------------------------------------------------------}
  27.  
  28. type
  29.   PElement = ^TElement;
  30.   TElement = record
  31.     Data : TData;
  32.     Next : PElement;
  33. end;
  34.  
  35. {------------------------------------------------------------------------------}
  36.  
  37. type
  38.   TSinglyLinkedList = class
  39.     private
  40.       FFirst    : PElement;
  41.       FLast     : PElement;
  42.       FCount    : LongWord;
  43.     private
  44.       function CreateElement(AData: TData) : PElement;
  45.       procedure GetElementByIndex(AIndex: Cardinal; out APrev, AElement: PElement);
  46.       function GetCapacity : LongWord;
  47.     public
  48.       constructor Create;
  49.       destructor Destroy; override;
  50.     public
  51.       procedure Add(AElement : TData);
  52.       procedure Insert(AElement : TData; AIndex : Word);
  53.       procedure Delete(AIndex : Word);
  54.       procedure Clear;
  55.     public
  56.       function Find(AData : TData) : Integer;
  57.       function Get(AIndex : Word) : TData;
  58.     public
  59.       procedure SaveToFile(AFileName : String);
  60.       procedure LoadFromFile(AFileName : String);
  61.       procedure Print;
  62.     public
  63.       property Count : LongWord read FCount;
  64.       property Capacity : LongWord read GetCapacity;
  65.   end;
  66.  
  67. {==============================================================================}
  68.  
  69. implementation
  70.  
  71. {==============================================================================}
  72.  
  73. constructor TSinglyLinkedList.Create;
  74. begin
  75.   inherited Create();
  76.   FFirst := nil;
  77.   FLast := nil;
  78.   FCount := 0;
  79. end;
  80.  
  81. {------------------------------------------------------------------------------}
  82.  
  83. destructor TSinglyLinkedList.Destroy;
  84. begin
  85.   Clear();
  86.   inherited Destroy();
  87. end;
  88.  
  89. {------------------------------------------------------------------------------}
  90.  
  91. function TSinglyLinkedList.CreateElement(AData: TData) : PElement;
  92. begin
  93.   New(Result);
  94.   Result^.Next := nil;
  95.   Result^.Data := AData;
  96. end;
  97.  
  98. {------------------------------------------------------------------------------}
  99.  
  100. procedure TSinglyLinkedList.GetElementByIndex(AIndex: Cardinal; out APrev, AElement: PElement);
  101. begin
  102.   AElement := FFirst;
  103.   APrev := nil;
  104.  
  105.   while AIndex > 0 do
  106.   begin
  107.     APrev := AElement;
  108.     AElement := AElement^.Next;
  109.     Dec(AIndex);
  110.   end;
  111. end;
  112.  
  113. {------------------------------------------------------------------------------}
  114.  
  115. function TSinglyLinkedList.GetCapacity : LongWord;
  116. begin
  117.   Result := FCount * ELEMENT_DATA_SIZE;
  118. end;
  119.  
  120. {------------------------------------------------------------------------------}
  121.  
  122. procedure TSinglyLinkedList.Add(AElement : TData);
  123. var
  124.   NewOne : PElement;
  125. begin
  126.   NewOne := CreateElement(AElement);
  127.  
  128.   if FFirst = nil then
  129.   begin
  130.     FFirst := NewOne;
  131.     FLast := FFirst;
  132.   end
  133.   else
  134.   begin
  135.     FLast^.Next := NewOne;
  136.     FLast := NewOne;
  137.   end;
  138.  
  139.   Inc(FCount);
  140. end;
  141.  
  142. {------------------------------------------------------------------------------}
  143.  
  144. procedure TSinglyLinkedList.Insert(AElement : TData; AIndex : Word);
  145. var
  146.   NewOne, Next, Prev : PElement;
  147. begin
  148.   if AIndex = FCount - 1 then
  149.     Add(AElement)
  150.   else
  151.   begin
  152.     NewOne := CreateElement(AElement);
  153.  
  154.     GetElementByIndex(AIndex, Prev, Next);
  155.  
  156.     if Next = FFirst then
  157.     begin
  158.       NewOne^.Next := FFirst;
  159.       FFirst := NewOne;
  160.     end
  161.     else
  162.     begin
  163.       Prev^.Next := NewOne;
  164.       NewOne^.Next := Next;
  165.       if NewOne^.Next = nil then
  166.         FLast := NewOne;
  167.     end;
  168.  
  169.     Inc(FCount);
  170.   end;
  171. end;
  172.  
  173. {------------------------------------------------------------------------------}
  174.  
  175. procedure TSinglyLinkedList.Delete(AIndex : Word);
  176. var
  177.   ToDelete, Prev: PElement;
  178. begin
  179.   if AIndex = 0 then
  180.   begin
  181.     ToDelete := FFirst;
  182.     FFirst := FFirst^.Next;
  183.  
  184.     if FFirst = nil then
  185.       FLast := nil;
  186.   end
  187.   else
  188.   begin
  189.     GetElementByIndex(AIndex, Prev, ToDelete);
  190.  
  191.     if ToDelete^.Next = nil then
  192.     begin
  193.       FLast := Prev;
  194.       Prev^.Next := nil;
  195.     end
  196.     else
  197.       Prev^.Next := ToDelete^.Next;
  198.   end;
  199.  
  200.   Dispose(ToDelete);
  201.   Dec(FCount);
  202. end;
  203.  
  204. {------------------------------------------------------------------------------}
  205.  
  206. procedure TSinglyLinkedList.Clear;
  207. var
  208.   ToDelete : PElement;
  209. begin
  210.   while FFirst <> nil do
  211.   begin
  212.     ToDelete := FFirst;
  213.     FFirst := FFirst^.Next;
  214.     Dispose(ToDelete);
  215.   end;
  216.   FLast := nil;
  217.   FCount := 0;
  218. end;
  219.  
  220. {------------------------------------------------------------------------------}
  221.  
  222. function TSinglyLinkedList.Find(AData : TData) : Integer;
  223. var
  224.   ToFind : PElement;
  225. begin
  226.   Result := 0;
  227.   ToFind := FFirst;
  228.  
  229.   while ToFind <> nil do
  230.   if ToFind^.Data = AData then
  231.     Exit
  232.   else
  233.   begin
  234.     ToFind := ToFind^.Next;
  235.     Inc(Result);
  236.   end;
  237.  
  238.   Result := -1;
  239. end;
  240.  
  241. {------------------------------------------------------------------------------}
  242.  
  243. function TSinglyLinkedList.Get(AIndex : Word) : TData;
  244. var
  245.   ToGet, Unused : PElement;
  246. begin
  247.   if AIndex = FCount - 1 then
  248.     Result := FLast^.Data
  249.   else
  250.   begin
  251.     GetElementByIndex(AIndex, Unused, ToGet);
  252.     Result := ToGet^.Data;
  253.   end;
  254. end;
  255.  
  256. {------------------------------------------------------------------------------}
  257.  
  258. procedure TSinglyLinkedList.SaveToFile(AFileName : String);
  259. var
  260.   SaveFile : TFileStream;
  261.   ToSave   : PElement;
  262. begin
  263.   SaveFile := TFileStream.Create(AFileName, fmCreate);
  264.   ToSave := FFirst;
  265.   try
  266.     while ToSave <> nil do
  267.     begin
  268.       SaveFile.WriteBuffer(ToSave^.Data, ELEMENT_DATA_SIZE);
  269.       ToSave := ToSave^.Next;
  270.     end;
  271.   finally
  272.     FreeAndNil(SaveFile);
  273.   end;
  274. end;
  275.  
  276. {------------------------------------------------------------------------------}
  277.  
  278. procedure TSinglyLinkedList.LoadFromFile(AFileName : String);
  279. var
  280.   LoadFile : TFileStream;
  281.   ToLoad   : TData;
  282. begin
  283.   LoadFile := TFileStream.Create(AFileName, fmOpenRead);
  284.   try
  285.     while LoadFile.Position < LoadFile.Size do
  286.     begin
  287.       LoadFile.ReadBuffer(ToLoad, ELEMENT_DATA_SIZE);
  288.       Add(ToLoad);
  289.     end;
  290.   finally
  291.     FreeAndNil(LoadFile);
  292.   end;
  293. end;
  294.  
  295. {------------------------------------------------------------------------------}
  296.  
  297. procedure TSinglyLinkedList.Print;
  298. var
  299.   ToPrint : PElement;
  300.   Index   : Word;
  301. begin
  302.   ToPrint := FFirst;
  303.   Index := 0;
  304.  
  305.   Writeln('Count: ', FCount);
  306.   Writeln('Capacity: ', GetCapacity);
  307.   while ToPrint <> nil do
  308.   begin
  309.     Writeln('Index: ',Index,' Data: ',  ToPrint^.Data);
  310.  
  311.     ToPrint := ToPrint^.Next;
  312.     Inc(Index);
  313.   end;
  314. end;
  315.  
  316. {==============================================================================}
  317.  
  318. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement