home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / CTECHAPP.ZIP / CONTAINR.ZIP / WORKLIST.CPP < prev    next >
C/C++ Source or Header  |  1990-01-27  |  3KB  |  161 lines

  1. //  Module:     WorkList (A Useful Kind of Doubly-Linked List)
  2. //  Version:    3.20
  3. //
  4. //  Language:   C++ 2.0
  5. //  Environ:    Any
  6. //
  7. //  Purpose:    I'm not sure what to call this kind of doubly-linked list;
  8. //              it's been so useful, I needed to create a class for it. So,
  9. //              WorkList is what it's called!
  10. //
  11. //  Written by: Scott Robert Ladd
  12.  
  13. #include "WorkList.hpp"
  14.  
  15. extern "C"
  16.     {
  17.     #include "stddef.h"
  18.     }
  19.  
  20. // constructor
  21. WorkList::WorkList() : DoublyLinkedList()
  22.     {
  23.     Current = NULL;
  24.     }
  25.  
  26. // copy constructor
  27. WorkList::WorkList(const WorkList & wl) : DoublyLinkedList(wl)
  28.     {}
  29.  
  30. // assignment operator
  31. void WorkList::operator = (const WorkList & wl)
  32.     {
  33.     DoublyLinkedList::operator = (wl);
  34.  
  35.     Current = Head;
  36.     }
  37.  
  38. // store an item
  39. int WorkList::Store(void * item)
  40.     {
  41.     DListNode * new_item;
  42.  
  43.     new_item = new DListNode;
  44.  
  45.     if (item == NULL)
  46.         return 1;
  47.  
  48.     new_item->Prev    = NULL;
  49.     new_item->Next    = NULL;
  50.     new_item->DataPtr = item;
  51.  
  52.     if (Head == NULL)
  53.         {
  54.         Head    = new_item;
  55.         Tail    = new_item;
  56.         Current = new_item;
  57.         }
  58.     else
  59.         {
  60.         Head->Prev = new_item;
  61.         new_item->Next = Head;
  62.         Head = new_item;
  63.         }
  64.  
  65.     ++Count;
  66.  
  67.     return 0;
  68.     }
  69.  
  70. // examine an item
  71. void * WorkList::Examine()
  72.     {
  73.     if (Current == NULL)
  74.         return NULL;
  75.     else
  76.         return Current->DataPtr;
  77.     }
  78.  
  79. // read and remove an item
  80. void * WorkList::Retrieve()
  81.     {
  82.     void * value = Examine();
  83.  
  84.     Delete(value);
  85.  
  86.     return value;
  87.     }
  88.  
  89. // delete an item from the list
  90. int WorkList::Delete(void * item)
  91.     {
  92.     DListNode * temp;
  93.  
  94.     temp = Head;
  95.  
  96.     while (temp != NULL)
  97.         {
  98.         if (temp->DataPtr == item)
  99.             {
  100.             if (temp == Current)
  101.                 Current = temp->Next;
  102.  
  103.             if (temp->Prev == NULL)
  104.                 {
  105.                 Head = temp->Next;
  106.  
  107.                 if (Head != NULL)
  108.                     Head->Prev = NULL;
  109.  
  110.                 if (temp->Next == NULL)
  111.                     Tail = NULL;
  112.                 }
  113.             else
  114.                 {
  115.                 temp->Prev->Next = temp->Next;
  116.  
  117.                 if (temp->Next == NULL)
  118.                     Tail = temp->Prev;
  119.                 else
  120.                     temp->Next->Prev = temp->Prev;
  121.                 }
  122.  
  123.             delete temp;
  124.  
  125.             --Count;
  126.  
  127.             return 0;
  128.             }
  129.  
  130.         temp = temp->Next;
  131.         }
  132.  
  133.     return 1;
  134.     }
  135.  
  136. // go to head of list
  137. void WorkList::GoToHead()
  138.     {
  139.     Current = Head;
  140.     }
  141.  
  142. // go to end of list
  143. void WorkList::GoToTail()
  144.     {
  145.     Current = Tail;
  146.     }
  147.  
  148. // go to next item in list
  149. void WorkList::GoNext()
  150.     {
  151.     if (Current != NULL)
  152.         Current = Current->Next;
  153.     }
  154.  
  155. // go to next item in list
  156. void WorkList::GoPrev()
  157.     {
  158.     if (Current != NULL)
  159.         Current = Current->Prev;
  160.     }
  161.