LList.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //---------------------------------------------------------------------------
  2. //
  3. // LList.h -- Prototype for linked lists
  4. //
  5. //---------------------------------------------------------------------------//
  6. // Copyright (C) Microsoft Corporation. All rights reserved. //
  7. //===========================================================================//
  8. #ifndef LLIST_H
  9. #define LLIST_H
  10. //---------------------------------------------------------------------------
  11. // Include Files
  12. #ifndef DSTD_H
  13. #include "dstd.h"
  14. #endif
  15. //---------------------------------------------------------------------------
  16. // Macro Definitions
  17. #ifndef NULL
  18. #define NULL 0L
  19. #endif
  20. //---------------------------------------------------------------------------
  21. // Structure and Class Definitions
  22. struct Link
  23. {
  24. Link *Next;
  25. Link (Link *InitNext = NULL)
  26. {
  27. Next = InitNext;
  28. }
  29. Link *GetNext (void)
  30. {
  31. return Next;
  32. }
  33. virtual ~Link (void) {}
  34. };
  35. //---------------------------------------------------------------------------
  36. class LinkedList
  37. {
  38. protected:
  39. Link *Head;
  40. Link *Tail;
  41. public:
  42. LinkedList (void)
  43. {
  44. Head = Tail = NULL;
  45. }
  46. virtual ~LinkedList ()
  47. {
  48. Kill();
  49. }
  50. void AddToHead (Link *Node);
  51. void AddToTail (Link *Node);
  52. void Remove (Link *Node, Link *Last=NULL); // The second param is if you know the previous pointer, you can optimize
  53. void Destroy (Link *Node, Link *Last = NULL); // The 'Last' parameter is optional in all of the methods that have it.
  54. void InsertAfter (Link *PlaceTo, Link *NodeToPut); // If sent, it avoids a search through the list.
  55. void InsertBefore (Link *PlaceTo, Link *NodeToPut);
  56. void Kill();
  57. void MoveAfter (Link *PlaceTo, Link *NodeToPut, Link *Last = NULL);
  58. bool Traverse (Link *&Current);
  59. bool IsEmpty (void)
  60. {
  61. return Head == NULL;
  62. }
  63. Link *GetHead (void)
  64. {
  65. return Head;
  66. }
  67. Link *GetTail (void)
  68. {
  69. return Tail;
  70. }
  71. unsigned long Count (void);
  72. };
  73. //---------------------------------------------------------------------------
  74. #endif
  75. //---------------------------------------------------------------------------
  76. //
  77. // Edit Log
  78. //
  79. //---------------------------------------------------------------------------