I. The Double-Ended List
The double-ended list, or Dlist, is a templated container. It
supports the following operational methods:
* isEmpty: a predicate that returns true if the list is empty,
false otherwise
* insertFront/insertBack: insert an object at the front/back of
the list, respectively
* removeFront/removeBack: remove an object from the front/back of
a non-empty list, respectively; throws
an exception if the list is empty.
Note that while this list is templated across the contained type, T,
it inserts and removes only pointers-to-T, not instances of T. This
ensures that the Dlist implementation knows that it owns inserted
objects, is responsible for copying them if the list is copied, and
destroying them if the list is destroyed.
The complete interface of the Dlist class is provided in dlist.h. The
code is replicated here for your convenience. You may not modify
dlist.h in any way.