#include enum { kIsSmaller, kIsLarger, kIsSame}; class Data { public: Data(int newVal):value(newVal) {} ~Data() { std::cout << "Deleting Data object with value: "; std::cout << value << "\n"; } int compare(const Data&); void show() { std::cout << value << "\n"; } private: int value; }; int Data::compare(const Data& otherObject) { if (value < otherObject.value) return kIsSmaller; if (value > otherObject.value) return kIsLarger; else return kIsSame; } class Cat { public: Cat(int newAge): age(newAge) {} ~Cat() { std::cout << "Deleting " << age << " year old Cat.\n"; } int compare(const Cat&); void show() { std::cout << "This cat is " << age << " years old\n"; } private: int age; }; int Cat::compare(const Cat& otherCat) { if (age < otherCat.age) return kIsSmaller; if (age > otherCat.age) return kIsLarger; else return kIsSame; } template class Node { public: Node() {} virtual ~Node() {} virtual Node* insert(T* object) = 0; virtual void show() = 0; private: }; template class InternalNode: public Node { public: InternalNode(T* theObject, Node* next); virtual ~InternalNode(){ delete next; delete object; } virtual Node* insert(T* object); virtual void show() { object->show(); next->show(); } private: T* object; Node* next; }; template InternalNode::InternalNode(T* newObject, Node* newNext): object(newObject), next(newNext) { } template Node* InternalNode::insert(T* newObject) { int result = object->compare(*newObject); switch(result) { case kIsSame: case kIsLarger: { InternalNode * objectNode = new InternalNode(newObject, this); return objectNode; } case kIsSmaller: next = next->insert(newObject); return this; } return this; } template class TailNode : public Node { public: TailNode() {} virtual ~TailNode() {} virtual Node* insert(T* object); virtual void show() {} private: }; template Node* TailNode::insert(T* object) { InternalNode* objectNode = new InternalNode(object, this); return objectNode; } template class HeadNode : public Node { public: HeadNode(); virtual ~HeadNode() { delete next; } virtual Node* insert(T* object); virtual void show() { next->show(); } private: Node* next; }; template HeadNode::HeadNode() { next = new TailNode; } template Node* HeadNode::insert(T* object) { next = next->insert(object); return this; } template class LinkedList { public: LinkedList(); ~LinkedList() { delete head; } void insert(T* object); void showAll() { head->show(); } private: HeadNode* head; }; template LinkedList::LinkedList() { head = new HeadNode; } template void LinkedList::insert(T* pObject) { head->insert(pObject); } void myFunction(LinkedList& listOfCats); void myOtherFunction(LinkedList& listOfData); int main() { LinkedList listOfCats; LinkedList listOfData; myFunction(listOfCats); myOtherFunction(listOfData); std::cout << "\n"; listOfCats.showAll(); std::cout << "\n"; listOfData.showAll(); std::cout << "\n ************ \n\n"; return 0; } void myFunction(LinkedList& listOfCats) { Cat* pCat; int val; while (true) { std::cout << "\nHow old is your cat (0 to stop)? "; std::cin >> val; if (!val) break; pCat = new Cat(val); listOfCats.insert(pCat); } } void myOtherFunction(LinkedList& listOfData) { Data* pData; int val; while (true) { std::cout << "\nWhat value (0 to stop)? "; std::cin >> val; if (!val) break; pData = new Data(val); listOfData.insert(pData); } }