#ifndef LINKED_LIST #define LINKED_LIST #include using namespace std; template class Node{ public: T data; Node* next; Node(T d, Node* n):data(d),next(n){} }; template class LinkedList{ public: Node* head; LinkedList():head(0){} void deleteNode(T d){ if(!head){ cout << d << " not in empty list " << endl; return; } Node* prev = 0; Node* curr = head; while(d != curr->data && curr->next ){ prev = curr; curr = curr->next; } // delete at beginning of list if(!prev){ Node* temp = head; head = head->next; delete temp; } // delete at end of list else if(!curr->next){ Node* temp = curr; prev->next = 0; delete temp; } // delete in middle of list else { Node* temp = curr; prev->next = curr->next; delete temp; } } void add(T d){ if(!head){ head = new Node(d,0); return; } Node* prev = 0; Node* curr = head; while(d > curr->data && curr ){ prev = curr; curr = curr->next; if(!curr)break; } // insert at beginning at list if(!prev){ head = new Node(d, head); } // insert at end else if(!curr){ prev->next = new Node(d, 0); } // insert in middle else{ prev->next = new Node(d, curr); } } bool empty(){ return !head; } ~LinkedList(){ Node *curr = head; Node *temp; cout << "in d-tor" << endl; while(curr){ cout << " deleting at " << curr << endl; temp = curr; curr = curr->next; delete temp; } } friend ostream& operator << (ostream o, LinkedList const &L); }; template ostream& operator << (ostream &o, LinkedList const &L){ Node *curr = L.head; if(!L.head){o << "empty list" << endl; return o;} o << endl << "Linked List: " << endl << endl; while(curr){ o << curr->data << endl; curr = curr->next; } o << endl; return o; } #endif